【问题标题】:Unobtrusive client validation data attributes are not rendered for nested property rules不为嵌套属性规则呈现不显眼的客户端验证数据属性
【发布时间】:2013-06-21 15:06:05
【问题描述】:

使用 FluentValidation 4.4,以下规则会在输入字段上发出正确的不显眼的验证数据属性:

RuleFor(e => e.PrimaryContact).NotEmpty();

呈现以下 html:

<input class="text-box single-line k-textbox input-validation-error" 
       data-val="true" data-val-required="'Primary Contact' should not be empty." 
       id="PrimaryContact" name="PrimaryContact" type="text" value="">

但是,具有嵌套属性的规则不会发出任何验证数据属性:

RuleFor(e => e.Company.Name).NotEmpty();

呈现以下 html:

 <input class="text-box single-line k-textbox" id="Company_Name" name="Company.Name" type="text" value="">

我错过了什么?

【问题讨论】:

    标签: asp.net-mvc validation asp.net-mvc-4 fluentvalidation


    【解决方案1】:

    如果您需要验证子对象中的每个属性,这可能会有点草率。我建议做他们在documentation here 上所做的事情。

    [Validator(typeof(ParentObjectValidator))]
    public class ParentObject 
    {
        public string PrimaryContact {get;set;}
        public Company Company {get;set;}
    }
    
    [Validator(typeof(CompanyValidator))] // This one is required!
                                          // Otherwise no data-val-required will be assigned
    public class Company
    {
        public string Name {get;set;}
    }
    

    为子对象设置验证器。

    public class CompanyValidator : AbstractValidator<Company> {
        public CompanyValidator() {
          RuleFor(company => company.Name).NotEmpty();
          //etc
        }
    }
    

    然后,在您的父对象中,您可以像这样将该验证器设置为子对象。

    public class ParentObjectValidator : AbstractValidator<ParentObject> {
      public ParentObjectValidator() {
        RuleFor(e => e.PrimaryContact).NotEmpty();
        RuleFor(e => e.Company).SetValidator(new CompanyValidator());
      }
    }
    

    这应该为您指明正确的方向!

    【讨论】:

    • 我试图避免这种情况,因为我有多个具有不同规则的公司属性。最后,我用自己的验证器实现创建了两个独立的公司模型。
    【解决方案2】:

    我已经遇到了像“jrummel”这样的问题!!!

    如果我使用 SetValidator 为嵌套的 ViewModel 对象定义验证器,则 MVC EditorFor 方法不会呈现任何 data-val* 属性。所以没有客户端验证确实有效......

    但所有其他属性(不是嵌套的嵌套 viewModelType)都工作得很好。输入具有 data-val* 属性。 --> 怎么回事?

    在我找到 http://www.paraesthesia.com/archive/2013/04/17/fluentvalidation-and-mvc-from-server-to-client.aspx 并且确实了解了验证机制的工作原理之后,我意识到我缺少 MyNestedViewModelType 类上的 [Validator(typeof(MyNestedViewModelType))] 属性。

    希望这可以帮助其他人节省时间 ;-)

    【讨论】:

    • 完全相同的情况,添加 [Validator(typeof(...)] 解决了这个问题,但是......如果 childviewmodel 是一种通用的 viewmodel 怎么办。并且验证应该取决于父上下文。这才是真正的困境所在。无论如何,感谢您分享您的想法,这对您有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2011-10-11
    • 2014-04-04
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多