2012-04-06 27 views
0

我正在使用asp.net mvc 3,并在发布更改时使用tryUpdateModel时遇到问题。当屏幕上的所有项目被删除时,TryUpdateModel不会清空项目的集合

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

当我将项目添加到集合时,TryUpdateModel工作得很好,但是当我删除集合中的所有项目时,此集合不会再发布到表单值中,而TryUpdateModel也不会完成任何操作而不会清除我的集合。

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

感谢

+0

如果通过ajax删除收集项目,为什么TryUpdateModel会执行任何操作(关于收集)?还有什么要清除的? – 2012-04-06 14:19:08

+0

是的,我使用部分视图通过AJAX添加/删除项目,该部分视图将呈现删除项目或添加新项目的列表。但是我现在不保存更改,只是在删除/添加项目的情况下更新视图。然后,我点击我的保存按钮,它会回传所有内容,然后将整个对象图保存在我的数据库中。 – Vincent 2012-04-06 14:24:54

回答

1

好吧,我不知道为什么它不会清除集合,而是一个解决方法可能是只检测时,相关表格值缺失,并手动删除的项目。例如:

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

就我而言,我在对象图中有很多列表,如果我可以避免必须测试每个集合是否为空,它将会很棒。 如果我没有其他的解决方案,我会去找你的窍门。 谢谢 – Vincent 2012-04-10 07:30:08

0

我一直在处理这个问题。事实证明,the code for TryUpdateModel没有任何问题,但它完全取决于ValueProvider给出的内容。

至于AJAX(我的情况也一样),它是真正可能的是JsonValueProviderFactory是一个解析响应并执行该TryUpdateModel方法,谁永远不会发现这些价值观哪里有控制器给出的值。由于TryUpdateModel仅基于值提供程序提供的属性更新目标模型,因此它不会触摸清空的集合,因为提供者根本不会发送这些属性。

发生这种情况的代码是this line in JsonValueProviderFactory,其中零大小的数组永远不会获得添加到后备存储的值,从而使属性“dissapear”。

我在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 

他正在做的是在数组发送为空时添加具有空值的属性。

可以与同时暴露在那里,并通过在Global.asax文件中这样把它挂到你的应用程序的代码,Application_Start方法使自己ValueProviderFactory

ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault()); 
ValueProviderFactories.Factories.Add(new YourOwnJsonValueProviderFactory()); 

这没有解决我的问题,我希望它为你的未来和未来做了它TryUpdateModel'ers

相关问题