加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 验证嵌套模型

发布时间:2020-12-16 07:00:15 所属栏目:asp.Net 来源:网络整理
导读:我目前有一个ViewModel设置: public class OurViewModel { public OurViewModel() { } [Required] public int LeadID { get; set; } [Required] public int Rate { get; set; } [Required] public bool DepositRequired { get; set; } [RequiredIfOtherProp
我目前有一个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”是一个验证器,它完全按照它所说的:检查另一个属性是否为真(在这种情况下,我们的布尔值表示是否需要存款),而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绑定上处理w /嵌套模型验证?

解决方法

不幸的是,通过内置验证,您必须使用

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读