我一直在处理这个问题。事实证明,for 的代码TryUpdateModel
没有任何问题,但这完全取决于ValueProvider
给出的内容。
至于 AJAX(我的情况也是如此),很可能JsonValueProviderFactory
是解析响应并向执行该TryUpdateModel
方法的控制器提供值的那个,而控制器永远不会在那里找到这些值。由于TryUpdateModel
仅根据值提供者提供的属性更新目标模型,因此它不会触及清空的集合,因为这些属性根本不是由提供者发送的。
实现这一点的代码是in 中的这一行JsonValueProviderFactory
,其中一个大小为零的数组永远不会将值添加到后备存储中,从而使属性“消失”。
从 2012 年 1 月起,我在 ASP.NET Codeplex 站点(带有空数组的 Json 请求)中发现了有关此错误的报告,并且 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());
This did solve my problem, I hope it does it for your too and future TryUpdateModel'ers.