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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- asp-classic – 在经典ASP中检测字典对象
- asp.net-mvc – Windsor NHibernate ISession MV
- asp.net – 如何在Azure应用服务中管理(非SSL)证
- ASP.NET Core Mvc中空返回值的处理方式
- ASP.NET AJAX与ASP.NET MVC中的jQuery
- asp.net – 以编程方式将HTML转换为Markdown语法
- asp.net – 我可以通过编程方式加载’Roles’属性
- asp.net-mvc – MVC4捆绑使用Scripts.Render时速
- asp.net上传文件到数据库的解决方案
- asp.net – Mysql中int(10)的最大大小是多少?
热点阅读