【发布时间】:2021-09-11 18:40:36
【问题描述】:
我有一个 Blazor 组件,其中包含一个人的姓名和他们的地址。我已经拆分了地址,以便我可以重复使用它。我在人员和地址之间使用 2 路数据绑定,以确保将数据传递到地址并且人员可以接收地址更改。
我无法让验证工作。人员全名和地址行 1 不能为空。当我使用 VaidationSummary 时,它会正确报告两个字段都不能为空。但是当我使用 ValidationMessage 时,只有人的全名会报告验证消息。我正在使用 Fluent 验证,但我认为问题是 ValidationMessage 在复杂类型中不报告。
我认为这是因为地址行 1 ValidationMessage 的 For() 属性与主表单(Person)数据模型中的字段名称不匹配。主数据模型将地址类作为地址,但地址组件将其作为值。但是,如果我要重用组件,那么很可能会发生这种情况!
分离像地址这样的组件似乎是一件合理的事情,并且您可能在一个表单上拥有多个地址对象(例如交付和计费),所以我只需要知道如何去做。
有人做过吗?是否需要自定义 ValidationMessage 或不同的 For() 实现?
感谢您对此的帮助。这是源代码。
表格:
<EditForm Model=@FormData>
<FluentValidator/>
<ValidationSummary/>
<InputText @bind-Value=FormData.FullName />
<ValidationMessage For="@(() => FormData.FullName)"/>
<ComponentAddress @bind-Value=FormData.Address />
<input type="submit" value="Submit" class="btn btn-primary" />
</EditForm>
@code{
PersonDataModel FormData = new PersonDataModel();
}
地址组件:
<InputText @bind-Value=Value.Address1 @onchange="UpdateValue" />
<ValidationMessage For="@(() => Value.Address1)" />
@code{
[Parameter] public AddressDataModel Value { get; set; }
[Parameter] public EventCallback<AddressDataModel> ValueChanged { get; set; }
protected async Task UpdateValue()
{
await ValueChanged.InvokeAsync(Value);
}
}
人物模型:
public class PersonDataModel
{
[Required]
public string FullName { get; set; }
public AddressDataModel Address { get; set; }
public PersonDataModel()
{
Address = new AddressDataModel();
}
}
地址模型:
public class AddressDataModel
{
[Required]
public string Address1 { get; set; }
}
Person Fluent 验证器:
public class PersonValidator : AbstractValidator<PersonDataModel>
{
public PersonValidator()
{
RuleFor(r => r.FullName).NotEmpty().WithMessage("You must enter a name");
RuleFor(r => r.Address.Address1).NotEmpty().WithMessage("You must enter Address line 1");
}
}
【问题讨论】:
-
你可以看看this。
-
所以我发现了一个关于这个的新问题。问题似乎是 FieldIdentifier 是由字段名称定义的。在子组件中,这是本地名称,但对于父窗体,它将是 ChildComponentName.FieldName。针对本地字段正确执行验证。 ValidationSummary 有效,因为它包含所有验证错误。 ValidationMessage 不起作用,因为它会查找 EditContext 的字段名称。由于 EditContext 是针对父级设置的,因此名称不同且未找到任何消息。
标签: asp.net-core blazor-server-side