首页 > 解决方案 > 为什么带有 FluentValidation 的 MudBlazor SelectList 会抛出“验证函数错误”

问题描述

我正在使用 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。当涉及到选择列表时,该文档没有显示任何示例可以促进与常规输入不同的方法。

任何有类似经验的解决方案?

标签: blazor-server-sidemudblazor

解决方案


原来我失踪了

    For="@(()=> Model.Item)

在我的 MudSelect 上。

添加这个解决了它。这个问题可能应该归档为拼写错误或“RTFM”。


推荐阅读