当在屏幕上删除所有项目时,TryUpdateModel不会清空项目集合

时间:2012-04-06 14:13:50

标签: asp.net-mvc-3

我正在使用asp.net mvc 3,并且在发布更改时遇到使用tryUpdateModel的问题。

我有一个包含多个项目列表的模型,我的视图可以通过Ajax添加或删除项目,并且我可以使用保存按钮保存更改。

当我向集合中添加项目时,TryUpdateModel工作正常,但是当我删除集合中的所有项目时,此集合不再以表单值的形式发布,并且TryUpdateModel不执行任何操作而不是清除我的集合。

我该如何处理这种情况?有人找到了解决方法吗?我是否必须覆盖DefaultModelBinder?

由于

2 个答案:

答案 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 做到。