【问题标题】:MVC Required TagHelper working with FluentValidation ASPNET CoreMVC 必需 TagHelper 与 FluentValidation ASPNET Core 一起使用
【发布时间】:2020-01-05 13:07:17
【问题描述】:

我正在尝试在需要验证并具有 FluentValidation 提供的验证元数据的表单字段上自动呈现一个红色小星号。

我已经完成了 50%,但是使用 When(.... 子句会导致一些问题。

一个简化的例子是: 标签助手

public class NjordInputTagHelper : TagHelper
{
public override void Process(
            TagHelperContext context,
            TagHelperOutput output)
        {

            IValidator validator = _factory.GetValidator(For.Metadata.ContainerType);
            if (validator == null)
            {
                return;
            }

            IValidatorDescriptor description = validator.CreateDescriptor();

            IEnumerable<IPropertyValidator> propertyValidators = description.GetValidatorsForMember(For.Metadata.PropertyName);


            if ((For.Metadata.ModelType != typeof(bool) && For.Metadata.IsRequired ) 
                //|| propertyValidators.Any(p=> p is NotNullValidator || p is NotEmptyValidator )
                )
            {
             //insert asterisk
            }
        }
}

我的验证器

public class MyValidator: AbstractValidator<MyModel>
{
    public MyValidator()
    {
         When(x=>x.MyPropertyA != null, () => 
         {
            RuleFor(x=> x.MyPropertyB).NotEmpty();
         })
    }
}

基本上,我试图仅在条件为真时启用某些验证。所以当MyPropertyA != null 我想确保MyPropertyBNotEmpty()

一切正常,除非在我的标签助手中,如您所见,我正在检查 NotNullValidatorNotEmptyValidator 并且 NotEmptyValidator 始终存在,在这种情况下,它不会运行 @ 987654330@ 条件,因为在呈现页面时,我确定 MyPropertyA 为空

也许我错过了什么?

谢谢

史蒂夫

【问题讨论】:

    标签: c# asp.net-mvc .net-core fluentvalidation


    【解决方案1】:

    试试这个:

    public MyValidator()
    {
    
      RuleFor(x=> x.MyPropertyB).NotEmpty().When(x=>x.MyPropertyA != null);
    
    }
    

    【讨论】:

    • 我相信您对这个问题有一点误解,但感谢您的回复。
    【解决方案2】:

    Mr_M 是对的 When 应该可以。但在我看来,您想将该方法应用于多个字段,根据您的验证器代码来判断。所以你可以这样做:

    public class MyModelValidator : AbstractValidator<MyModel>
    {
        public MyModelValidator()
        {
            When(x => x.MyPropertyA != null, rules: new[]
            {
                RuleFor(x => x.MyPropertyB).NotEmpty(),
                RuleFor(x => x.MyPropertyC).NotEmpty()
            });
        }
    
        private void When<T>(Func<MyModel, bool> predicate, IEnumerable<IRuleBuilderOptions<MyModel, T>> rules)
        {
            foreach (var rule in rules)
            {
                rule.When(predicate);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2023-03-14
      • 2019-11-02
      相关资源
      最近更新 更多