我正在使用asp.net mvc 3,并且在发布更改时遇到使用tryUpdateModel的问题。
我有一个包含多个项目列表的模型,我的视图可以通过Ajax添加或删除项目,并且我可以使用保存按钮保存更改。
当我向集合中添加项目时,TryUpdateModel工作正常,但是当我删除集合中的所有项目时,此集合不再以表单值的形式发布,并且TryUpdateModel不执行任何操作而不是清除我的集合。
我该如何处理这种情况?有人找到了解决方法吗?我是否必须覆盖DefaultModelBinder?
由于
答案 0 :(得分:1)
我不知道为什么它不清除集合,但解决方法可能只是检测何时缺少相关的表单值,并手动删除项目。类似的东西:
public ActionResult Edit(SomeEntity obj)
{
if(Request.Form["expectedFormValue"] == null)
{
obj.YourCollection.Clear();
}
TryUpdateModel(obj);
}
答案 1 :(得分:0)
我一直在处理这个问题。事实证明,the code for TryUpdateModel
没有任何问题,但它完全取决于ValueProvider
给出的内容。
对于AJAX(我的情况也是如此),JsonValueProviderFactory
很可能是解析响应并为执行TryUpdateModel
方法的Controller赋值,谁永远不会发现那些价值观。由于TryUpdateModel
仅根据值提供程序提供的属性更新目标模型,因此它不会触及清空的集合,因为提供程序根本不会发送这些属性。
实现此目的的代码是this line in JsonValueProviderFactory
,其中零大小的数组永远不会将值添加到后备存储,从而使属性“消失”。
我从2012年1月开始在ASP.NET Codeplex站点(Json Request with empty array)中找到此错误的报告,并且wallymathieu(提交者)提供了一个补丁来处理这个问题。这是补丁的相关部分:
//BEGIN CHANGE
if (l.Count == 0) {
AddToBackingStore(backingStore, prefix, null);
}
else for (int i = 0; i < l.Count; i++) {
//END CHANGE
当他将数组作为空发送时,他正在做的是添加具有空值的属性。
您可以使用公开的代码制作自己的ValueProviderFactory
,并通过Global.asax
文件Application_Start
方法将其与应用程序连接起来:
ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault());
ValueProviderFactories.Factories.Add(new YourOwnJsonValueProviderFactory());
这确实解决了我的问题,我希望它能为你和未来的 TryUpdateModel'ers 做到。