Asp.net mvc 3 在屏幕上删除所有项目时,TryUpdateModel不会清空项目集合

Asp.net mvc 3 在屏幕上删除所有项目时,TryUpdateModel不会清空项目集合,asp.net-mvc-3,Asp.net Mvc 3,我正在使用asp.net mvc 3,发布更改时在使用tryUpdateModel时遇到问题 我有一个包含多个项目列表的模型,我的视图可以通过Ajax添加或删除项目,并且我可以使用保存按钮保存更改 当我向集合中添加项时,TryUpdateModel工作正常,但当我删除集合中的所有项时,该集合不再以表单值发布,TryUpdateModel不执行任何操作,而是清除我的集合 我如何处理这种情况?有人找到解决办法了吗?我必须重写DefaultModelBinder吗 谢谢我不知道它为什么不清除集合,但一

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

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

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

我如何处理这种情况?有人找到解决办法了吗?我必须重写DefaultModelBinder吗


谢谢

我不知道它为什么不清除集合,但一种解决方法可能是只检测相关表单值何时丢失,然后手动删除项目。比如:

public ActionResult Edit(SomeEntity obj)
{
    if(Request.Form["expectedFormValue"] == null)
    {
        obj.YourCollection.Clear();
    }
    TryUpdateModel(obj);
}

我一直在处理这个问题。事实证明,它没有任何问题,但它完全取决于
ValueProvider
提供的内容

至于AJAX(我的情况也是如此),很可能是
JsonValueProviderFactory
解析响应并将值提供给执行
TryUpdateModel
方法的控制器,而该控制器永远不会找到那些值。由于
TryUpdateModel
仅基于值提供程序提供的属性更新目标模型,因此它不会触及清空的集合,因为这些属性根本不是由提供程序发送的

实现这一点的代码是,零大小的数组将永远不会获得添加到备份存储的值,从而使属性“dissapear”

2012年1月,我在ASP.NET Codeplex站点()中发现了一个关于这个bug的报告,wallymathieu(提交者)提供了一个补丁来解决这个问题。这是修补程序的相关部分:

//BEGIN CHANGE
if (l.Count == 0) {
    AddToBackingStore(backingStore, prefix, null);
}
else for (int i = 0; i < l.Count; i++) {
//END CHANGE

这确实解决了我的问题,我希望它也能为您和未来的TryUpdateModel用户解决问题。

如果集合项通过ajax删除,TryUpdateModel为什么要做任何事情(关于集合)?还有什么需要澄清的?是的,我正在使用一个局部视图通过AJAX添加/删除项目,该视图将在删除项目或添加新项目的情况下呈现列表。但是我现在不保存更改,只是用删除/添加的项目更新视图。然后我点击我的保存按钮,它会发回所有内容,然后将整个对象图保存在我的数据库中。在我的例子中,一个对象图中有很多列表,如果我可以避免测试每个集合是否为空,那就太好了。如果我没有别的办法,我就用你的办法。谢谢
ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault());
ValueProviderFactories.Factories.Add(new YourOwnJsonValueProviderFactory());