2012-04-23 2 views
0

나는 AccountsViewModel는 다음과 같이 정의 :FluentValidation을 사용하여 복잡한 모델을 검증하고 모델에 계속 액세스 할 수 있습니까?

[Validator(typeof(AccountsValidator))] 
public class AccountsViewModel 
{ 
    public AccountsViewModel() 
    { 
     Accounts = new List<Account>(); 
     Accounts.Add(new Account { AccountNumber = string.Empty }); //There must be at least one account 
    } 

    public List<Account> Accounts { get; set; } 
} 

그리고 난 다음 유창하게 검증 있습니다

public class AccountsValidator : AbstractValidator<AccountsViewModel> 
{ 
    public AccountsValidator() 
    { 
     //Validate that a single account number has been entered. 
     RuleFor(x => x.Accounts[0].AccountNumber) 
      .NotEmpty() 
      .WithMessage("Please enter an account number.") 
      .OverridePropertyName("Accounts[0].AccountNumber"); 

     RuleFor(x => x.Accounts) 
      .SetCollectionValidator(new AccountValidator()); 
    } 
} 

public class AccountValidator : AbstractValidator<Account> 
{ 
    public AccountValidator() 
    { 
     RuleFor(x => x.AccountNumber) 
      .Matches(@"^\d{9}a?[0-9X]$") 
      .WithMessage("Please enter a valid account number."); 

     //TODO: Validate that the account number entered is not a duplicate account 
    } 
} 

나는 그것이 Accounts 컬렉션 중복되는 경우 계좌 번호에 오류를 추가하고 싶습니다를 . 그러나 AccountValidator 클래스에서는 계정 컬렉션에 액세스 할 수 없습니다 (알고있는 한). 계정 번호가 중복되지 않도록 계정 컬렉션에 대한 액세스 권한을 얻으려면 어떻게 변경하고 다시 작성할 수 있습니까?

+0

별로 좋지는 않지만 컬렉션을 AccountValidator 생성자에 매개 변수로 전달하여 로컬 필드로 유지할 수 있습니다. – ilmatte

답변

1

나는 당신의 접근 방식이 약간 틀린 것 같아서 당신이 이것을하기 위해 고심하고있다.

계정의 단일 유효성을 확인하는 데 AccountValidator를 사용해야합니다. 따라서 '계좌 번호는 고유해야 함'에 대한 귀하의 규칙은 컬렉션 레벨 (즉, AccountsValidator)에 구현되어야합니다. 이 경우 전체 컬렉션에 액세스 할 수 있으며 각 계정 번호가 고유하다는 것을 쉽게 알릴 수 있습니다.

AccountsValidator에서 현재 "비어 있지 않은"규칙을 AccountValidator로 이동해야합니다.