0

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

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

4

2 回答 2

1

我发现了 Phil Haack 的一篇博文,其中包含了答案

通过在带有我的集合名称的单独隐藏输入中使用任意索引 + .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>    
}
于 2013-06-04T20:58:57.357 回答
0

对您来说更简单的解决方案是只收集 ID。我假设可以在服务器端重新创建标题。在这种情况下,您只需定义:

@Html.Hidden("ThingIds", item.Id)

并绑定到

List<int> thingsIds
于 2013-06-04T21:01:24.310 回答