0

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

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

当我将项目添加到集合中时,TryUpdateModel 工作得很好,但是当我删除集合中的所有项目时,这个集合不再以表单值发布,并且 TryUpdateModel 什么都不做,而是清除我的集合。

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

谢谢

4

2 回答 2

1

好吧,我不知道为什么它不清除集合,但一种解决方法可能是检测何时缺少相关的表单值,然后手动删除这些项目。就像是:

public ActionResult Edit(SomeEntity obj)
{
    if(Request.Form["expectedFormValue"] == null)
    {
        obj.YourCollection.Clear();
    }
    TryUpdateModel(obj);
}
于 2012-04-06T14:50:55.347 回答
0

我一直在处理这个问题。事实证明,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.asaxApplication_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.

于 2013-01-30T02:55:20.613 回答