2012-04-17 15 views
13

Tôi đã một mô hình xem MVC3 định nghĩa là:Làm cách nào để bạn xác thực đối với từng chuỗi trong danh sách bằng cách sử dụng Xác thực thông thạo?

[Validator(typeof(AccountsValidator))] 
public class AccountViewModel 
{ 
    public List<string> Accounts { get; set; } 
} 

Với sự xác nhận được xác định bằng FluentValidation (v3.3.1.0) như:

public class AccountsValidator : AbstractValidator<AccountViewModel> 
{ 
    public AccountsValidator() 
    { 
     RuleFor(x => x.Accounts).SetCollectionValidator(new AccountValidator()); //This won't work 
    } 
} 

Và xác nhận tài khoản sẽ có thể được định nghĩa:

public class AccountValidator : AbstractValidator<string> { 
    public OrderValidator() { 
     RuleFor(x => x).NotNull(); 
     //any other validation here 
    } 
} 

Tôi muốn mỗi tài khoản trong danh sách được định giá như được mô tả trong documentation. Tuy nhiên, cuộc gọi tới SetCollectionValidator không hoạt động vì đây không phải là tùy chọn khi sử dụng List<string> mặc dù tùy chọn sẽ có nếu tùy chọn được xác định là List<Account>. Tui bỏ lỡ điều gì vậy? Tôi có thể thay đổi mô hình của mình để sử dụng List<Account> và sau đó xác định lớp Tài khoản nhưng tôi thực sự không muốn thay đổi mô hình của mình cho phù hợp với xác thực.

Để tham khảo, đây là quan điểm cho rằng tôi đang sử dụng:

@model MvcApplication9.Models.AccountViewModel 

@using (Html.BeginForm()) 
{ 
    @*The first account number is a required field.*@ 
    <li>Account number* @Html.EditorFor(m => m.Accounts[0].Account) @Html.ValidationMessageFor(m => m.Accounts[0].Account)</li> 

    for (int i = 1; i < Model.Accounts.Count; i++) 
    { 
     <li>Account number @Html.EditorFor(m => m.Accounts[i].Account) @Html.ValidationMessageFor(m => m.Accounts[i].Account)</li> 
    } 

    <input type="submit" value="Add more..." name="add"/> 
    <input type="submit" value="Continue" name="next"/> 
} 

Trả lời

17

Sau đây nên làm việc:

public class AccountsValidator : AbstractValidator<AccountViewModel> 
{ 
    public AccountsValidator() 
    { 
     RuleFor(x => x.Accounts).SetCollectionValidator(
      new AccountValidator("Accounts") 
     ); 
    } 
} 

public class AccountValidator : AbstractValidator<string> 
{ 
    public AccountValidator(string collectionName) 
    { 
     RuleFor(x => x) 
      .NotEmpty() 
      .OverridePropertyName(collectionName); 
    } 
} 
+1

Cảm ơn bạn, SetCollectionValidator đã hoạt động. Tôi không hoàn toàn chắc chắn tại sao tuyên bố này không có sẵn trước đây! Tuy nhiên, nó vẫn không hoạt động hoàn toàn đúng. Việc xác thực đang được sử dụng nhưng bất kỳ lỗi nào hiện được ghi vào trạng thái mô hình bằng khóa của "Tài khoản [0]. Tài khoản". Tôi sử dụng ValidationMessageFor (m => m.Accounts [i]) trong khung nhìn để hiển thị mỗi số tài khoản do đó ModelState sẽ có một khóa của "Accounts [0]". Tôi đã cố gắng thay đổi OverridePropertyName (collectionName) bằng cách sử dụng một tên trống và loại bỏ tuyên bố này hoàn toàn nhưng vẫn không thể làm cho nó hoạt động. – Dangerous

+0

Tôi có thể làm cho nó hoạt động bằng cách sử dụng @ Html.ValidationMessage ("Tài khoản [i]. Tài khoản") nhưng một lần nữa điều này có vẻ giống như một công việc xung quanh? Tôi đánh giá cao suy nghĩ của bạn về điều này? Cảm ơn một lần nữa. – Dangerous

+1

Tôi đã quyết định sử dụng mô hình Tài khoản thay vì chuỗi. Do đó, các lỗi hiện được báo cáo chính xác. Do đó, tên bộ sưu tập trên không được yêu cầu làm tham số. – Dangerous

1

lớp Validation:

using FluentValidation; 
using System.Collections.Generic; 

namespace Test.Validator 
{ 

    public class EmailCollection 
    { 
     public IEnumerable<string> email { get; set; } 

    } 

    public class EmailValidator: AbstractValidator<string> 
    { 
     public EmailValidator() 
     { 
      RuleFor(x => x).Length(0, 5); 
     } 

    } 

    public class EmailListValidator: AbstractValidator<EmailCollection> 
    { 
     public EmailListValidator() 
     { 
      RuleFor(x => x.email).SetCollectionValidator(new EmailValidator()); 
     } 

    } 



} 

Lưu ý: Tôi đã sử dụng phiên bản mới nhất của MVC 5 (Nuget) của fluentvalidation.

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