GON*_*ale 17 asp.net-mvc updatemodel formcollection
我有兴趣知道你们认为应该被视为UpdateModelASP.NET MVC 中的方法的"正确行为" .
我在这里问的原因可能是,如果这个功能是"按设计",有人可以澄清为什么它是这样的,也许是一种方式来调用它来实现所需的功能,我想这将是90百分之百的民众希望这个有用吗?
从本质上讲,我的抱怨在于绑定过程中的行为UpdateModel.
假设您希望通过简单的Save操作方法更新表单,表单上的数据字段反映了数据库中的模型,最初要保存请求,我们可能会从数据库中获取现有模型,然后更新相关字段哪些更改,发送FormCollection,然后更新UpdateModel到我们现有的模型.这个函数,但是看起来这个DB填充对象的任何现有属性都被"重置"; 并且我的意思是,被设置为null或初始化默认值就像它是一个全新的对象,除了显然那些与那些匹配的对象FormCollection.
这是一个问题,因为对象上存在的任何现有属性,但不一定存在于表单上,例如任何子集合或对象,日期或任何非UI面向字段都是空的,留下半人满,更多或者由于所有丢失的数据(包括现在可能设置为0的ID堆栈)而无法保存到DB的较少的不可用对象.
我认为这不是理想的行为,UpdateModel只应更新找到属性匹配的属性FormCollection.这意味着您的所有现有属性都将保持不变,但您的更新将被设置.但是,从目前为止推断的内容来看,显然情况并非如此 - 它似乎实例化了一个全新的对象副本,从表单中更新属性,然后返回新对象.
最后,为了了解这是多少负担,保存半复杂形式并保留所有现有对象数据的唯一方法是手动将每个属性与相应的表单属性结合到绝对保证仅更新表单中存在的属性.
我猜,
请随时提出你对这些家伙的看法,谢谢.
以下是遇到此问题的另一个实例:
使用一组复杂数据类型调用UpdateModel会重置所有非绑定值吗?
Lev*_*evi 15
您使用UpdateModel()时遇到的行为听起来像是列表绑定,在这种情况下,UpdateModel()将清除列表中的内容并重新填充它.有关此问题的讨论,请参见Hanselman的博客.如果要更新单个对象,UpdateModel()将更新该单个对象,从而使具有相应表单值的属性保持原样.
其中许多问题归结为UpdateModel()实际上是基于表单输入重新填充视图模型 - 而不是域模型.(我通过说视图模型只是控制器和视图之间的契约来略微简化,而您的域模型可能是LINQ2SQL或EF模型对象.)所有MVC教程和演示都显示UpdateModel()用于数据库对象,我觉得这是不幸的,因为它对模型绑定的预期目的有些误导.Robert的帖子更能说明UpdateModel()的实际意图.
我相信你对UpdateModel的行为是正确的.
但是,ASP.NET MVC遵循"往返"模型,这意味着您的表单应该已经包含了生成完整记录所需的所有字段,因为您将所有字段的值都推送到视图中,或者您要求用户提供所有字段.
这种往返概念非常重要.请记住,在真正的MVC模型中,没有状态概念.您从数据库表中检索数据,将此数据推送到视图,数据显示给用户,程序停止.用户编辑数据,单击您的发布按钮,视图将数据发布到控制器方法,数据保存到数据库中,程序停止.从一个操作到下一个操作根本没有依赖关系.
这种不保留记录和数据结构的部分状态的做法使得编写可以很好地扩展并且表现良好的应用程序非常简单(特别是对于诸如浏览器中的后退按钮之类的东西).
| 归档时间: |
|
| 查看次数: |
4242 次 |
| 最近记录: |