ASP.Net MVC - GET/POST 具有不同模型时的 ModelState.AddModelError

标签 asp.net asp.net-mvc asp.net-mvc-5

我有一个用例,我在 Controller 中对 GET 和 POST 操作使用了不同的模型。这对我来说非常有用,因为大部分数据都进入了标签。 GET 方法的模型包含 10 个属性,而 POST 方法的模型只需要 3 个。

这个 GET View 呈现一个表单,它只需要这些属性中的 3 个,而不是全部 10 个。因此,POST 方法的模型接受一个只包含这 3 个属性的模型类。因此,ASP.Net MVC 模型绑定(bind)器仅使用这 3 个必要属性填充我的 POST 方法上的模型类参数,一切正常。

问题来了:当我在POST方法中遇到一些违反业务规则,想使用ModelState.AddModelError,重新显示原来的 View 时,我不再有7个属性没有发布,因为它们不是表单的一部分,也不是此方法作为其参数的模型类的一部分。

目前,我正在调用构建器以返回 POST 方法的模型类实例,并将 GET 方法本身委托(delegate)给同一个构建器。因此,在这些情况下,当 POST 方法中存在一些违反业务规则的情况时,我将返回一个 View("OriginalGetView", originalGetModel)。在这种情况下,如果我想使用完全不同的模型类将自定义消息发送回 View ,我该如何在 POST 方法中使用 ModelState.AddModelError?

为 GET 和 POST 方法使用相同的模型类似乎太懒了,因为它们的需求如此不同。这里的最佳做法是什么?我看到很多人建议对这两种方法使用相同的模型,并将所有字段从隐藏的表单字段中 POST 回来,但是在大多数情况下这似乎是在浪费带宽,而且感觉很难看当我已经有了“VendorId”时,将“VendorName”之类的东西发送回服务器。

最佳答案

我可能误解了您的意图,但请确保您没有因小失大。我看到您可能只想发布标识符而不一定是描述符。但听起来您必须在发布后重新显示 View ...如果是这样,如果您发布与 get 中相同的模型,则可以访问模型属性。如果您只发布标识符,则必须花时间重新访问数据库以使用供应商 ID 号获取描述值(即您描述的供应商名称)?那不也是额外的处理吗?就像我说的,我可能会误解你的帖子,但为了保持一致性,使用相同的 View 模型来获取和发布 View 对我来说最有意义。

关于ASP.Net MVC - GET/POST 具有不同模型时的 ModelState.AddModelError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30582818/

相关文章:

c# - 在 Entity Framework 4.1 (POCO) 中添加具有预定义 PK 值的记录

asp.net - jquery 实时 tabIndex

c# - Gridview 绑定(bind)到 XML

asp.net - 布局 View 中的 Roles.GetRolesForUser() 不返回角色

asp.net-mvc-5 - 异步 Controller 方法显示 Task<ActionResult> 的类型名称

c# - DBResourceprovider 没有被调用

asp.net-mvc - 在 ASP.Net MVC 中寻找转发器类型功能

javascript - 将值从 QueryString 传递到 asp.net mvc 中 Controller 的 Index 操作

asp.net-mvc - 在 VS 2012 中创建并运行 MVC 5 项目

c# - 尝试将类型注册到 IoC 容器时,HttpContext.Current 为空