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-core – asp.net核心依赖注入问题 – AddScoped没有
- asp.net – 我可以确定HttpModules是按照HttpApplication.M
- asp.net-mvc – 验证消息中的换行符
- modelstate – asp.net mvc没有实体框架
- asp.net – 如何从RouteData获取路由名称?
- asp.net-web-api – 如何访问所有querystring参数作为字典
- 如何在ASP.NET 4.0应用程序的IIS管理器中添加用户?
- asp.net – 我们可以用IIS运行Selenium WebDriver测试用例,
- asp.net-mvc – ASP.NET MVC – 如何获取一个动作的完整路径
- asp.net core 实现一个简单的仓储的方法
- asp.net-mvc-4 – 如何在MVC 4中创建自定义WebSe
- asp.net – NullReferenceException在PipelineSt
- 强制ASP.Net MVC Bundle以某种顺序呈现javascrip
- asp.net web大文件上传带进度条实例代码
- ASP.net检查页面是http还是https
- ASP.NET内置用户配置文件与旧stile用户类/表
- asp.net – 如何根据用户的角色创建具有不同显示
- asp.net-mvc – VS2012 ProjectTypeGuids在安装A
- asp.net-mvc-3 – 使用.SetValidator()时,Fluent
- asp.net – 在.NET 4下编译时出现“具有相同密钥
