5

使用 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="">

我错过了什么?

4

2 回答 2

4

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

[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());
  }
}

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

于 2013-06-24T23:45:07.553 回答
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并且我确实了解了验证机制是如何工作的之后,我认识到我缺少[Validator(typeof(MyNestedViewModelType))]MyNestedViewModelType 类的属性。

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

于 2013-07-03T15:34:26.010 回答