asp.net-mvc - ASP.NET MVC 中 UpdateModel 的正确行为是什么?

标签 asp.net-mvc updatemodel formcollection

我很想知道你们认为就 UpdateModel 而言应该被视为“正确的行为”。 ASP.NET MVC 中的方法。

我在这里问的原因也许是,如果这个功能是“设计的”,有人可以澄清为什么它是这样的,也许是一种不同的调用方式来实现所需的功能,我想这就是 90 的方式% 的人希望这能奏效吗?

本质上,我的提示在于 UpdateModel 中的绑定(bind)过程的行为。 .

假设您希望通过简单的 Save 更新表单表单上的数据字段反射(reflect)数据库中模型的操作方法,最初为了保存请求,我们可能会从数据库中获取现有模型,然后更新已更改的相关字段,通过 FormCollection 发送然后由 UpdateModel 更新到我们现有的模型。此功能,但似乎此 DB 填充对象上的任何现有属性正在“重置”;我的意思是,被设置为 null 或初始化默认值,就像它是一个全新的对象一样,除了那些与 FormCollection 中的对象匹配的对象。 .

这是一个问题,因为对象上存在但不一定存在于表单上的任何现有属性,例如任何子集合或对象、日期或任何非面向 UI 的字段都是空的,给您留下了一半填充、更多或由于所有丢失的数据(包括可能现在设置为 0 的 ID 堆栈)而无法保存到数据库的不可用对象。

我认为这是不可取的行为,UpdateModel应该只更新在 FormCollection 中找到属性匹配的属性.这意味着您现有的所有属性都将保持不变,但您的更新将被设置。然而,从目前的推论来看,显然情况并非如此——它似乎实例化了一个全新的对象副本,更新表单的属性,然后返回新对象。

最后,从这个负担的角度来看,保存半复杂形式并保留所有现有对象数据的唯一方法是手动合并。每个 属性与相应的表单属性,以绝对保证仅更新表单中存在的属性。

我猜,

  • 那些同意这是设计使然的人,我的形式结合是最好的方式吗?
  • 或者,你是如何解决这个问题的?

  • 请随时提供您对这些人的想法,谢谢。

    这是另一个遭受此问题的人的例子:
    Calling UpdateModel with a collection of complex data types reset all non-bound values?

    最佳答案

    您在使用 UpdateModel() 时遇到的行为听起来像是在绑定(bind)列表,在这种情况下 UpdateModel() 会清除列表的内容并重新填充它。见 Hanselman's blog对此进行讨论。如果您要更新单个对象,UpdateModel() 将更新该单个对象,将没有相应表单值的属性保持原样。

    许多这些问题归结为 UpdateModel() 真正意味着重新填充 View 模型 - 而不是域模型 - 基于表单输入。 (我通过说 View 模型只是 Controller 和 View 之间的契约来稍微简化事情,而您的域模型可能是 LINQ2SQL 或 EF 模型对象。)所有 MVC 教程和演示都显示 UpdateModel() 是用于数据库对象,我觉得这很不幸,因为它对模型绑定(bind)的预期目的有些误导。 Robert 的帖子更能说明 UpdateModel() 的实际意图。

    关于asp.net-mvc - ASP.NET MVC 中 UpdateModel 的正确行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1242758/

    相关文章:

    c# - asp.NET MVC 2 DataAnnotations UpdateModel<T> 验证

    asp.net-mvc - MVC UpdateModel 和子类与基类

    forms - Symfony2 - ReferencedColumnName id 为空

    asp.net-mvc - FormCollection.AllKeys 和 FormCollection.Keys 之间的区别

    asp.net-mvc - 在单个表单中使用两个提交按钮

    c# - 我如何访问 ASP.NET MVC 3 模型中的虚拟目录?

    c# - 如何禁用 ModelMetadata.IsRequired 对于不可空值类型始终为真

    c# - 每次我引用一个用户配置文件时,EF 都会创建一个新的用户配置文件?

    c# - Ajax.BeginFrom 验证模型

    ios - RestKit 更新对象映射空属性