5

私は現在、ViewModelを次のように設定しています。

public class OurViewModel
    {
        public OurViewModel() { }

        [Required]
        public int LeadID { get; set; }
        [Required]
        public int Rate { get; set; }
        [Required]
        public bool DepositRequired { get; set; }
        [RequiredIfOtherPropertyIsTrue("DepositRequired")]
        public BankInfo { get; set; }
    }

...この場合、「RequiredIfOtherPropertyIsTrue」は、それが言うことをほぼ実行するバリデーターです。別のプロパティがtrue(この場合、デポジットが必要かどうかを示すブール値)であるかどうかを確認し、BankInfoは別の次のようなモデル:

public class BankInfo
{
    public enum AccountTypeEnum
    {
        CHECKING,
        SAVINGS
    }

    public BankAccountInfo() { }

    [DisplayName("Account Number")]
    [Required(ErrorMessage = "You must provide a valid bank account number")]
    public String AccountNumber { get; set; }

    [DisplayName("Bank Routing Number")]
    [Required(ErrorMessage = "You must provide a valid routing number")]
    [StringLength(9, MinimumLength = 9, ErrorMessage = "Your bank routing number must be exactly 9 digits")]
    public String ABANumber { get; set; }

    [DisplayName("Bank Account Type")]
    [Required]
    public AccountTypeEnum AccountType { get; set; }

    [DisplayName("Name on Bank Account")]
    [Required(ErrorMessage = "You must provide the name on your bank account")]
    public String AccountName { get; set; }
}

これで、ViewModelに、DepositRequiredブール値にバインドされたチェックボックスと、BankInfoのカスタムテンプレートを含むEditorForがあります。送信時に、モデルで必要とされていない場合にBankInfoで検証を無効にする方法を理解するに問題があります(たとえば、ViewModelでプロパティが必要ない場合でも、BankInfoでvalがトリガーされるため、任意のフォーム投稿)。ViewModelバインドでネストされたモデルの検証を処理するための標準的な方法はありますか?

4

1 に答える 1

5

残念ながら、組み込みの検証では、使用する必要があります

ModelState.Remove("BankInfo");

そのオブジェクトの検証の失敗を条件付きで無視します。

FluentValidation の使用がオプションである場合、OurViewModelValidator で次のようなことができます。

RuleFor(ourViewModel=> ourViewModel.BankInfo).SetValidator(new BankInfoValidator()).When(ourViewModel=> ourViewModel.DepositRequired);

次に、BankInfoValidator にそのオブジェクトの検証を処理させます。

何かのようなもの:

public class BankInfoValidator : AbstractValidator<BankInfo>
{
    public BankAccountInfoValidator() 
    {
        RuleFor(bank => bank.AccountName).NotEmpty().WithMessage("You must provide a name for your bank account.");
        RuleFor(bank => bank.AccountNumber).NotEmpty().WithMessage("You must provide an account number for your bank information.");
        RuleFor(bank => bank.AccountType).NotEmpty().WithMessage("You must select what kind of bank account you're entering information for (checking, savings).");
        RuleFor(bank => bank.ABANumber).NotEmpty().WithMessage("You must provide a routing number for your bank information.");
        RuleFor(bank => bank.ABANumber).Must(BeOnlyDigits).WithMessage("Your routing number can only contain numeric characters, 0-9.");
        RuleFor(bank => bank.AccountNumber).Must(BeOnlyDigits).WithMessage("Your account number can only contain numeric characters, 0-9.");
    }

    private bool BeOnlyDigits(string digitString)
    {
        int result;
        return int.TryParse(digitString, out result);
    }
于 2012-12-28T15:51:24.923 に答える