ASP MVC传递非顺序项

时间:2016-08-01 21:50:27

标签: javascript c# jquery asp.net-mvc asp.net-mvc-4

我有一个包含public List<Room> Rooms { get; set; }的视图模型房间包含List<BL.Image> Images。在我看来,我循环通过房间并显示每个图像。

for (int i = 0; i < Model.Rooms.Count; i++)
{
    @for (var ii = 0; ii < Model.Rooms[i].Images.Count; ii++)
    {
        <div class="slide">
            <img class="pic panel" src="@Url.Content(Model.Rooms[i].Images.ToList()[ii].Path)" />
            @{ ViewBag.Imageindex = "Rooms[" + i + "].Images[" + ii + "].Index"; }
            <input type="hidden" name="@ViewBag.ImageIndex" value="@Html.Raw(ii)" />
@*also tried<input type="hidden" name="@ViewBag.ImageIndex" value="" />also tried*@

            @Html.HiddenFor(m => Model.Rooms[i].Images.ToList()[ii].ImageID, new { Name = "Rooms[" + i + "].Images[" + ii + "].ImageID" })
            @Html.HiddenFor(m => Model.Rooms[i].Images.ToList()[ii].Path, new { Name = "Rooms[" + i + "].Images[" + ii + "].Path" })
            <div class="snipit">
                <img class="hoverpic panel" src="http://findicons.com/files/icons/99/office/128/delete.png" width="40" height="40" />
            </div>
        </div>
    }
}

用户可以添加或删除图像,但如果图像被删除,则在提交表单时,只会识别删除图像之前的图像,例如

  • 显示图像1,图像2,图像3,图像4

  • 图片3被删除

  • 提交表单时,只识别图像1和。

我审核解决此问题的一个问题是this one,我似乎在做同样的事情。这个问题还链接到Blog Post - 最后它涵盖了非顺序索引

  

非连续指数   ...当您无法保证提交的值将保持顺序索引时会发生什么?例如,假设您希望在通过JavaScript提交书籍列表之前允许删除行。   好消息是,通过引入额外的隐藏输入,您可以允许任意索引。在下面的示例中,我们为每个需要绑定到列表的项目提供带有.Index后缀的隐藏输入。每个隐藏输入的名称都是相同的...这将为模型绑定器提供一个很好的索引集合,以便在绑定到列表时查找。

<form method="post" action="/Home/Create">

<input type="hidden" name="products.Index" value="cold" />
<input type="text" name="products[cold].Name" value="Beer" />
<input type="text" name="products[cold].Price" value="7.32" />

<input type="hidden" name="products.Index" value="123" />
<input type="text" name="products[123].Name" value="Chips" />
<input type="text" name="products[123].Price" value="2.23" />

<input type="hidden" name="products.Index" value="caliente" />
<input type="text" name="products[caliente].Name" value="Salsa" />
<input type="text" name="products[caliente].Price" value="1.23" />

<input type="submit" />

  

不幸的是,我们没有帮助生成这些隐藏的输入。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

对于名称为Rooms.IndexRooms[i].Images.Index的集合索引器,您需要2个隐藏输入。此外,请勿尝试更改name方法生成的HtmlHelper属性。你的代码应该是

for (int i = 0; i < Model.Rooms.Count; i++)
{
    <input type="hidden" name="Rooms.Index" value="@i" /> // outer indexer
    @for (var ii = 0; ii < Model.Rooms[i].Images.Count; ii++)
    {
        <input type="hidden" name="Rooms[@i].Images.Index" value="@ii" /> // inner indexer
        <div class="slide">
            <img class="pic panel" src="@Url.Content(Model.Rooms[i].Images.ToList()[ii].Path)" />
            @Html.HiddenFor(m => Model.Rooms[i].Images[ii].ImageID)
            @Html.HiddenFor(m => Model.Rooms[i].Images[ii].Path)
            <div class="snipit">
                <img class="hoverpic panel" src="http://findicons.com/files/icons/99/office/128/delete.png" width="40" height="40" />
            </div>
        </div>
    }
}