我有一个Blazor组件,包含一个人的姓名和地址。我将地址拆分出来以便复用。我正在使用双向数据绑定来确保数据被传递到地址,并且人员可以接收地址更改。但是,我无法使验证起作用。人的全名和地址行 1 不能为空。当我使用ValidationSummary时,它正确地报告两个字段都不能为空。但是当我使用ValidationMessage时,只有人的全名报告了验证消息。我正在使用Fluent验证,但我认为问题是ValidationMessage不在一个复杂类型中时不能正确报告。
我认为这是因为Address line 1的For()属性与主表单(Person)数据模型中的字段名称不匹配。主数据模型将地址类命名为Address,但是地址组件将其命名为Value。但是,如果我要重用该组件,则可能会发生这种情况!
像地址这样分离组件似乎是合理的事情,而且您可能需要在一个表单上拥有多个地址对象(例如交付和账单),因此我只需要知道如何做到这一点。
有人做过这个吗?是否需要自定义ValidationMessage或不同的For()实现?
感谢您对此的帮助。以下是源代码。
表单:
我认为这是因为Address line 1的For()属性与主表单(Person)数据模型中的字段名称不匹配。主数据模型将地址类命名为Address,但是地址组件将其命名为Value。但是,如果我要重用该组件,则可能会发生这种情况!
像地址这样分离组件似乎是合理的事情,而且您可能需要在一个表单上拥有多个地址对象(例如交付和账单),因此我只需要知道如何做到这一点。
有人做过这个吗?是否需要自定义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; }
}
人员流畅性验证器:
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");
}
}