asp.net – 验证嵌套的ViewModels
我有两个ViewModel(简化):
public class ParentViewModel { public ParentViewModel { Content = new ChildViewModel(); } public ChildViewModel Content { get; set,} } public class ChildViewModel { [Required] public string Name1 { get; set,} [Required] public string Name2 { get; set,} } 以下控制器发布动作: [HttpPost] public ActionResult Create(ParentViewModel viewModel) { if (ModelState.IsValid) { // process viewModel -> write something into database return RedirectToAction("Index"); } return View(viewModel); } 现在我将一个post请求体中的以下表单值发送到与该操作对应的URL(在Fiddler Request Builder中手动): > Content.Name1 = X. 这工作正常,Name1属性填充在viewModel.Content中,Name2为null,模型状态无效,因为Name2是必需的.因此,验证按预期失败. 现在viewModel.Content不为null(因为我在构造函数中实例化它),但所有属性Name1和Name2都为null.这是预料之中的.我没想到的是模型状态是有效的,因此它通过了验证(之后导致数据库异常,因为存在非可空列). 如何改进此代码以便验证在第二种情况下也适用? 我做了三个实验: >我已在ParentViewModel构造函数中删除了Content的实例化,然后在上面的第二个示例中Content为null,但验证仍然通过. public class ParentViewModel { [Required] public ChildViewModel Content { get; set,} } 我现在得出结论,在ParentViewModel构造函数中实例化Content子属性是问题的根源,并且模型绑定器本身必须实例化子属性(如果请求中没有匹配的表单字段,则必须实例化)以便具有正常工作的服务器端验证. 我在其他几个视图模型构造函数中有子属性实例化,直到现在才注意到这个问题.那么,这通常是一种不好的做法吗?还有其他方法可以解决这个问题吗? 解决方法
ModelState.IsValid告诉您是否已将任何模型错误添加到ModelState.
默认模型绑定器将为基本类型转换问题添加一些错误,例如为“int”的内容传递非数字.您可以根据您正在使用的任何验证系统更完整地填充ModelState.我建议查看数据注释以验证ViewModel,因为它运行良好. 这种语法可能是错误的或旧的. ModelState.AddModelError(“key”,Exception) 转述自 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET MVC Url路由支持(点)
- asp.net – EF是否在DbContext的不同实例之间缓存实体?
- asp.net – IIS7中的SQL Server和Windows身份验证
- asp.net – 相当于[DataMember(Name =“Test”)]的JsonResu
- asp.net-web-api2 – Web Api 2 Post – UrlHelper.Link不能
- asp.net-mvc – Asp.net MVC 3路由区域失败
- asp.net-mvc – 验证嵌套模型
- asp.net-mvc – 如何在Windows Azure网站(asp.net mvc4)上更
- ASP.NET WebApi RESTful标准
- asp.net – System.Web.UI.ViewStateException,无效的views