2012-04-03 74 views
2

比方说一个有示范MVC ModelBinding到列表 - 失去项目

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工作好以下。我将完整的模型添加到我的ActionMethod中。

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

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

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

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

非常感谢您提前!

回答

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"/> 

欲了解更多信息,请看看非循序索引菲尔哈克的博客文章的部分:

Model Binding To A List

+0

这引入了一个额外的输入字段为n项... – xandercoded 2012-04-03 14:57:20

+0

多数民众赞成它;)谢谢你!我知道Haacked Article,但由于任何原因,我错过了它。 – dknaack 2012-04-03 14:58:05

+0

@Xander这是它的工作原理。如果您正在随机生成随机区域,那么跟踪索引是非常困难的。另一方面,你可以用这种方式来绑定它,例如通过将索引设置为一个GUID:'' – tugberk 2012-04-03 15:00:26

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"/> 
+0

是的,这是我现在所拥有的。我的问题是,有没有更好的解决方案? – dknaack 2012-04-03 14:51:53

+0

Xander,请看看我的答案。 – tugberk 2012-04-03 14:54:34

+0

你的问题没有提到你正在重新建立索引...我的解决方案将适当地重新绑定到你的模型... – xandercoded 2012-04-03 14:54:55