我有一个可排序的项目列表,这些项目是从模型上的数组属性生成的。我想使用jquery UI sortable来重新排序项目并在我的Action方法中保存这个顺序。
以下是我用来输出项目的代码:
@using(@Html.BeginForm("Save", "MyController", FormMethod.Post))
{
<input type="submit" value="Save"/>
@Html.HiddenFor(x=>x.Id)
<ul id="sortable2" class="connectedSortable">
@{
int count = 0;
}
@foreach(var item in Model.CollectionOfThings)
{
<li class="ui-state-default">
@Html.Hidden("Things[" + count + "].Id", item.Id)
@Html.Hidden("Things[" + count + "].Title", item.Title)
@item.Title
</li>
count++;
}
</ul>
}
当我在动作方法中收到模型时,顺序与我开始时的顺序相同。我明白这是因为索引,但我无法找到一种方法(没有编写一些自定义的javascript来更新每个隐藏输入的name属性),以使项目以正确的顺序绑定到数组。
任何人都可以建议一种可以实现的方法吗?我可以写一些Javascript来做它但我希望我可以用模型绑定完全做到这一点。
我尝试输出这样的输入:
@Html.Hidden("Things[].Id", item.Id)
然而,这只是导致我的收藏为空。
答案 0 :(得分:1)
我发现了a blog post from Phil Haack which contained the answer。
通过在我的集合名称+ .Index
的单独隐藏输入中使用任意索引,模型绑定器似乎可以处理它并维护顺序。
@using(@Html.BeginForm("Save", "MyController", FormMethod.Post))
{
<input type="submit" value="Save"/>
@Html.HiddenFor(x=>x.Id)
<ul id="sortable2" class="connectedSortable">
@{
int count = 0;
}
@foreach(var item in Model.CollectionOfThings)
{
<li class="ui-state-default">
@Html.Hidden("Things.Index", "item" + count)
@Html.Hidden("Things[item" + count + "].Id", item.Id)
@Html.Hidden("Things[item" + count + "].Title", item.Title)
@item.Title
</li>
count++;
}
</ul>
}
答案 1 :(得分:0)
更简单的解决方案就是只收集ID。我假设可以在服务器端重新创建标题。在这种情况下,您可以定义:
@Html.Hidden("ThingIds", item.Id)
并绑定到
List<int> thingsIds