我一直在处理这个问题。事实证明,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。
如果通过ajax删除收集项目,为什么TryUpdateModel会执行任何操作(关于收集)?还有什么要清除的? – 2012-04-06 14:19:08
是的,我使用部分视图通过AJAX添加/删除项目,该部分视图将呈现删除项目或添加新项目的列表。但是我现在不保存更改,只是在删除/添加项目的情况下更新视图。然后,我点击我的保存按钮,它会回传所有内容,然后将整个对象图保存在我的数据库中。 – Vincent 2012-04-06 14:24:54