2013-06-21 23 views
5

Sử dụng FluentValidation 4.4, các quy tắc sau phát ra đúng không phô trương dữ liệu xác nhận thuộc tính trên các lĩnh vực đầu vào:Không phô trương xác nhận khách hàng các thuộc tính dữ liệu không được trả lại cho các quy tắc tài sản lồng nhau

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

render html sau:

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

Tuy nhiên, quy tắc có thuộc tính lồng nhau không phát ra bất kỳ thuộc tính dữ liệu xác thực nào:

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

hiển thị html sau:

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

Tôi đang thiếu gì?

Trả lời

4

Điều đó có thể gây ra một chút cẩu thả trong trường hợp bạn cần phải xác thực trên mỗi thuộc tính trong đối tượng con. Tôi sẽ khuyên bạn nên làm những gì họ có trên documentation here của họ.

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

Đặt trình xác thực cho đối tượng con.

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

Sau đó, trong đối tượng mẹ, bạn có thể đặt trình xác nhận đó cho đối tượng con như vậy.

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

Điều này sẽ giúp bạn đi đúng hướng!

+0

Tôi đã cố gắng tránh điều đó vì tôi có nhiều thuộc tính công ty với các quy tắc khác nhau. Cuối cùng, tôi đã tạo ra hai mô hình công ty riêng biệt với việc triển khai trình xác thực của riêng họ. – jrummell

2

Tôi đã có cùng một Sự cố như "jrummel" !!!

Nếu tôi xác định Trình xác thực với SetValidator cho đối tượng ViewModel lồng nhau của tôi, thì MVC EditorFor Method đã không hiển thị bất kỳ thuộc tính data-val * nào. Và do đó không có xác thực phía khách hàng nào hoạt động ...

Nhưng mọi thuộc tính khác (không được lồng trong chế độ xem lồng nhauModelType) hoạt động rất tốt. Các đầu vào có các thuộc tính data-val *. -> WTF?

Sau khi tôi tìm thấy http://www.paraesthesia.com/archive/2013/04/17/fluentvalidation-and-mvc-from-server-to-client.aspx và tôi đã hiểu cơ chế xác thực đã hoạt động như thế nào, tôi nhận ra rằng tôi thiếu thuộc tính [Validator(typeof(MyNestedViewModelType))] trên lớp MyNestedViewModelType.

Hy vọng điều này sẽ giúp người khác tiết kiệm thời gian ;-)

+0

Tình hình chính xác tương tự, Thêm [Trình xác thực (loạiof (...)] đã giải quyết vấn đề nhưng .... Điều gì sẽ xảy ra nếu một childviewmodel là một dạng khung nhìn chung và xác thực sẽ xảy ra tùy thuộc vào ngữ cảnh gốc. Dù sao cảm ơn bạn đã chia sẻ suy nghĩ của bạn nó đã giúp !! –

Các vấn đề liên quan