asp.net-mvc – 不使用DropDownList和嵌套对象的ModelState验证
在我们的应用程序中,我们有一个Domain层,其中包含带有DataAnnotations for Validation的类.
我们在ASP.NET MVC ui层中的模型中使用这些类. 例如: 域层: public class Company { public int Id { get; set; } [Required] [StringLength(50)] public string Description { get; set; } // ... some model logic abreviated } public class Supplier { public int Id { get; set; } [Required] public string Name { get; set; } [Required] public Company Company { get; set; } // ... some model logic abreviated } 在我们的ASP.NET MVC表示层中: public class SupplierEditModel { public Supplier Supplier { get; set; } public IEnumerable<Company> Company { get; set; } public int SelectedCompany { get; set; } // ... some model logic abreviated } 在这种情况下,我们有一个包含公司DropDownList的页面.列表是这样绑定的: @Html.DropDownListFor(m => m.SelectedCompany,new SelectList(Model.Companies,"Id","Description",Model.SelectedCompany)) 我们的问题出在控制器的POST方法上,当我们检查ModelState.IsValid时,模型无效,因为Supplier.Company为null.然后我们可以使用SelectedCompany来获取公司,但我们的问题是,这意味着我们不能做这样的事情: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(SupplierEditModel model) { if (ModelState.IsValid) { model.CreateSupplier(_supplierService); return RedirectToAction("Index"); } return RedirectToAction("Create"); } 我们想在创建供应商之前使用验证. 解决方法
我看到你有(至少)两个选择:
如果视图中不需要,您可以展平视图模型并省略Supplier.Company. public class SupplierEditModel { public int SupplierId { get; set; } public string Name { get; set; } public Company Company { get; set; } public IEnumerable<Company> Company { get; set; } public int SelectedCompany { get; set; } // ... some model logic abreviated } (注意:您的数据注释应该在视图模型上,而不是域模型.) 要么 您可以在检查IsValid属性之前清除ModelState错误 ModelState.Remove(string key,ModelState); 这里的最佳做法可能是使用扁平模型,原因有两个.首先,通常只是发送视图所需的内容而不是更好的做法.如果视图没有对Supplier.Company执行任何操作,则它不应该是模型的一部分.二,使用ModelState.Remove方法虽然有效,但有些人可能会认为它是一个小小的kludgy.您可能会在代码审查中稍微破坏您的印章;) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- kendo-ui – Kendo UI ASP.NET MVC网格数据源过滤
- asp.net signalR 专题—— 第四篇 模拟RPC模式的
- 将单元测试添加到现有的asp.net Web表单应用程序
- 在同一台物理计算机上的应用程序(asp.net)之间共
- asp.net – 将代码从Subversion Repository部署到
- asp.net – 每个会话的NH请求 – “会话已关闭!
- asp.net-mvc-4 – @ *在CSHTML文件中的含义是什么
- asp.net-mvc – ASP.Net MVC的LoginStatus?
- asp.net-core – 如何使用带有IdentityServer4的
- asp.net-mvc – 如何使用Mono.WebServer(XSP)运行