MVC ModelBinding到列表 - 丢失项目

时间:2012-04-03 14:43:50

标签: asp.net-mvc asp.net-mvc-3

让我们说a有以下模型

public class FirstModel
{
    public List<SecondModel> SecondModels { get; set; }
}

public class SecondModel
{
    public string Value { get; set; }
}

这个视图

@model FirstModel

....
<input name="SecondModels[0].Value" value="test1"/>
<input name="SecondModels[1].Value" value="test2"/>
<input name="SecondModels[2].Value" value="test3"/>
...

Modelbinding效果很好。我将完整的Model送到了ActionMethod。

但是如果我使用例如jQuery删除中间的项目。

<input name="SecondModels[0].Value" value="test1"/>
<input name="SecondModels[2].Value" value="test3"/>

我丢失了SecondModels[2],因为ModelBinder无法绑定。 所以我只得到第一个(“test1”)。

是否有另一个语法或CustomModelBinder能够正确绑定它,还是我需要在删除项目后替换input名称?

非常感谢你!

2 个答案:

答案 0 :(得分:4)

您可以在此处使用ASP.NET MVC的非顺序模型绑定功能。在您的情况下,您需要以下内容:

<input type="hidden" name="SecondModels.Index" value="0" />
<input name="SecondModels[0].Value" value="test1"/>

<input type="hidden" name="SecondModels.Index" value="2" />
<input name="SecondModels[2].Value" value="test3"/>

有关更多信息,请查看Phil Haack博客文章的非顺序指数部分:

Model Binding To A List

答案 1 :(得分:0)

我在过去的项目中遇到过这个......

我的快速而肮脏的解决方案是使用适当的值重新索引项目列表。

所以:

<input name="SecondModels[0].Value" value="test1"/>
<input name="SecondModels[1].Value" value="test2"/>
<input name="SecondModels[2].Value" value="test3"/>
<input name="SecondModels[3].Value" value="test4"/>
<input name="SecondModels[4].Value" value="test5"/>

成为这个(当删除索引1和3时):

<input name="SecondModels[0].Value" value="test1"/>
<input name="SecondModels[1].Value" value="test3"/>
<input name="SecondModels[2].Value" value="test5"/>
相关问题