如何在ASP.NET MVC中保存包含表示数组的隐藏表单输入列表的顺序?

时间:2013-06-04 20:43:58

标签: asp.net-mvc jquery-ui-sortable

我有一个可排序的项目列表,这些项目是从模型上的数组属性生成的。我想使用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)

然而,这只是导致我的收藏为空。

2 个答案:

答案 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