我有兴趣知道你们认为应该被视为UpdateModelASP.NET MVC 中的方法的"正确行为" .
我在这里问的原因可能是,如果这个功能是"按设计",有人可以澄清为什么它是这样的,也许是一种方式来调用它来实现所需的功能,我想这将是90百分之百的民众希望这个有用吗?
从本质上讲,我的抱怨在于绑定过程中的行为UpdateModel.
假设您希望通过简单的Save操作方法更新表单,表单上的数据字段反映了数据库中的模型,最初要保存请求,我们可能会从数据库中获取现有模型,然后更新相关字段哪些更改,发送FormCollection,然后更新UpdateModel到我们现有的模型.这个函数,但是看起来这个DB填充对象的任何现有属性都被"重置"; 并且我的意思是,被设置为null或初始化默认值就像它是一个全新的对象,除了显然那些与那些匹配的对象FormCollection.
这是一个问题,因为对象上存在的任何现有属性,但不一定存在于表单上,例如任何子集合或对象,日期或任何非UI面向字段都是空的,留下半人满,更多或者由于所有丢失的数据(包括现在可能设置为0的ID堆栈)而无法保存到DB的较少的不可用对象.
我认为这不是理想的行为,UpdateModel只应更新找到属性匹配的属性FormCollection.这意味着您的所有现有属性都将保持不变,但您的更新将被设置.但是,从目前为止推断的内容来看,显然情况并非如此 - 它似乎实例化了一个全新的对象副本,从表单中更新属性,然后返回新对象.
最后,为了了解这是多少负担,保存半复杂形式并保留所有现有对象数据的唯一方法是手动将每个属性与相应的表单属性结合到绝对保证仅更新表单中存在的属性.
我猜,
请随时提出你对这些家伙的看法,谢谢.
以下是遇到此问题的另一个实例:
使用一组复杂数据类型调用UpdateModel会重置所有非绑定值吗?
http://www.asp.net/learn/mvc/tutorial-39-cs.aspx
我们使用上面的指南在我们的ASP.NET MVC应用程序中实现一些验证.
我们收到以下错误This property setter is obsolete, because its value is derived from ModelMetadata.Model now.,该错误没有行号,只是在按下提交按钮创建新消息时会爆炸.
我们必须使用MetaData示例(请参阅上面指南的底部),因为对象是在DBML中生成的
有关导致错误的原因的任何建议?
有人有运气吗?
如果我理解正确,请告诉我,如果我有一个简单的模型,请说:
public string Name { get; set; }
public string Details { get; set; }
public DateTime? Created { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后我执行:
var myModel = getCurrentModelFromDb(id);
UpdateModel(myModel, "ModelName", new string { "Name", "Details" });
Run Code Online (Sandbox Code Playgroud)
这应该只更新名称和详细信息属性吗?因为假设在'created'中已经有来自db的日期,当我执行上述操作时,它似乎将我创建的日期设置为原始的01-01-0001.
此外,当我尝试使用以下方法明确排除此字段时:
UpdateModel(myModel, "ModelName",
new string { "Name", "Details" }, new string { "Created" });
Run Code Online (Sandbox Code Playgroud)
它仍被设置为01-01-0001.这是一个错误,还是一个我做错的奇怪事情?
我真正想要做的是,更新我的模型属性,其中有相应的表单字段,但保留其余的单独的数据,这些属性是从db fetch单独设置的,而不是将它们设置为null或default,这就是它当前的内容似乎在做.
我会说,也许上面和我的真实场景之间的唯一区别是我在列表上使用updateModel,所以我实际上得到了listFromDb(parentId),然后在那个选择上应用updateModel(myList,"ListPrefix")通过[0],[1]等来计算每个项目...它的工作原理,因为所有名称都在更新,但其他一切都没有.
更新:我刚刚意识到'includeProperties'可能是要定义您希望从表单中包含哪些属性,类似于绑定的工作方式.如果*是*的情况,那么我怎么能告诉它只更新某些模型属性呢?