c# – 当model是子模型的集合时验证表单
发布时间:2020-12-15 22:28:51 所属栏目:百科 来源:网络整理
导读:我有一个需要几个模型才能正常工作的视图.所以,我创建了一个模型,它是多个(子)模型的集合.这是模型. public class PolicyDetail{ public Policy Policy { get; set; } public IEnumerableInsured Insureds { get; set; } public IEnumerableRisk Risks { get
我有一个需要几个模型才能正常工作的视图.所以,我创建了一个模型,它是多个(子)模型的集合.这是模型.
public class PolicyDetail { public Policy Policy { get; set; } public IEnumerable<Insured> Insureds { get; set; } public IEnumerable<Risk> Risks { get; set; } public IEnumerable<Construction> Constructions { get; set; } } 以下是一个子模型的示例,它是数据库中的实际实体: public class Policy { [Key] public int PolicyID { get; set; } [DisplayName("Policy Number")] public Guid PolicyNumber { get; set; } [Required(ErrorMessage = "Please enter a valid Effective Date.")] [DataType(DataType.DateTime)] [DisplayName("Effective Date")] [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}",ApplyFormatInEditMode = true)] public DateTime EffDate { get; set; } [Required(ErrorMessage = "Please enter a valid Expiration Date.")] [DataType(DataType.DateTime)] [DisplayName("Expiration Date")] [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}",ApplyFormatInEditMode = true)] public DateTime ExpDate { get; set; } public Boolean IsActive { get; set; } } 这一切都运行良好,直到我尝试提交有错误的表单来测试验证.我应该已经看到了这一点(可能?)但由于实际模型上没有任何验证标签,它总是通过if(ModelState.IsValid)检查.是否有某种方法可以强制执行或继承子类中的所有数据注释? 或者,我是否会使用其他模型集合的模型来解决这个问题?问题是,我希望能够从同一视图编辑/添加多个数据库实体. 编辑: Josh Carroll的This article看起来确实是我需要的.但是当我实现它时,我得到一个Null Object错误.这是我正在做的事情: public class PolicyDetail { [Required,ValidateObject] public Policy Policy { get; set; } public IEnumerable<Insured> Insureds { get; set; } public IEnumerable<Risk> Risks { get; set; } public IEnumerable<Construction> Constructions { get; set; } } 然后在覆盖方法中,他提供: protected override ValidationResult IsValid(object value,ValidationContext validationContext) { var results = new List<ValidationResult>(); var context = new ValidationContext(value,null,null); Validator.TryValidateObject(value,context,results,true); if (results.Count != 0) { var compositeResults = new CompositeValidationResult(String.Format("Validation for {0} failed!",validationContext.DisplayName)); results.ForEach(compositeResults.AddResult); return compositeResults; } return ValidationResult.Success; } } 参数“value”以null为单位,因此它在此行中出错: Validator.TryValidateObject(value,true); 我错过了什么吗?做错了什么? 解决方法
您可以使用以下方法手动调用子模型上的验证:
https://msdn.microsoft.com/en-us/library/dd411772.aspx
var context = new ValidationContext(model.Policy,serviceProvider: null,items: null); var validationResults = new List<ValidationResult>(); bool isValid = Validator.TryValidateObject(model.Policy,validationResults,true); 然后,您可以使用ModelState.AddModelError来构建响应. 绝对不是最优雅的解决方案,但可能比重写你所拥有的更容易. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |