我正在使用 Blazor Server 并在我的模型上使用 FluentValidation,如下所示:
public class ItemModel
{
public ItemModel()
{
Items = new string[]{"A","B","C"};
}
public string[] Items {get;set;}
public string Item {get;set;} = string.Empty;
}
public class ValidateItemModel : AbstractValidator<ItemModel>
{
public ValidateItemModel()
{
RuleFor(_ => _.Item).NotEmpty()
.WithMessage("You need to select an item");
}
public Func<object, string, IEnumerable<string>> Validate => (model, propertyName) =>
{
var result = Validate(ValidationContext<T>.CreateWithOptions((T)model,
x => x.IncludeProperties(propertyName)));
if (result.IsValid)
return Array.Empty<string>();
return result.Errors.Select(e => e.ErrorMessage);
};
}
在 DI 中,我正在像这样注册我的验证器:
services.AddValidatorsFromAssemblyContaining<ValidateItemModel>();
在我的 MudBlazor 组件中,我定义了一个 MudSelect,如下所示:
@inject ValidateItemModel validator
<MudItem xs="12" md="4">
<MudSelect T="string" @bind-Value="@Model.Item" Validation="validator.Validate">
@foreach (var item in Model.Items)
{
<MudSelectItem T="string" Value="@Model.Item">@item</MudSelectItem>
}
</MudSelect>
</MudItem>
但是,当我在 post 上验证表单或更改 select 的值时,会出现以下错误消息:
验证适用于其他元素,例如 MudText,但来自 MudSelect 的值甚至不进入验证 Func。当涉及到选择列表时,该文档没有显示任何示例可以促进与常规输入不同的方法。
任何有类似经验的解决方案?