ASP.NET MVC绑定数组到DropDownFor

时间:2015-12-28 19:59:26

标签: asp.net-mvc

我有一个数组,我想绑定到下拉列表。这是代码:

@for (int i = 1; i <= 5; i++)
{
    @for (int j = 1; j <= 7; j++)
    {
        @Html.DropDownListFor(m => @Model.Periods, new SelectList(@Model.Items, "Id", "Title", @Model.ScheduleList[i, j]))
    }
}

@ Model.Periods是一个普通的整数数组。 @ Model.ScheduleList是一个二维整数数组,它包含应该在绑定时选择的选项的值。 如果我更换:

@Model.Periods

使用:

@Model.Periods[i*10 + j]

正在显示所选的值,但生成的选择输入的名称类似于例如期间[34],而不仅仅是期间,我在视图模型中得到 null 回发。 所以我的问题是:如何将oridnary数组绑定到dropdown并将选定的值传递给另一个数组?

1 个答案:

答案 0 :(得分:1)

@ Model.Periods [i * 10 + j]不是100%正确 - 要将这些数据发布到您的COntroller,您必须将所有值从Periods[0]直接发送回Periods[5 * 7 - 1]

如果Periods[X](其中X包含0到34)中的任何一个将丢失,则您将无法获得正确的数据。数组的索引也应严格从0开始。

例如:

Periods[0] = 1
Periods[1] = 2
Periods[2] = 3
Periods[4] = 4

将绑定到以下数组:[1, 2, 3],因为没有有效负载项,顺序索引在2到4之间。

对于有效载荷:

Periods[1] = 1
Periods[2] = 2
Periods[3] = 3
Periods[4] = 4

结果将是null - 有效负载中缺少数组的第一个索引。

所以对你来说@Model.Periods[(i-1)*10 + (j-1)]可能没问题。

如果你真的需要你的索引是非顺序的,你可以使用这个解决办法:为每个元素添加隐藏字段:

<input type="hidden" name="Periods.Index" value="{your index}" />

所以你的代码会这样:

@for (int i = 1; i <= 5; i++)
{
    @for (int j = 1; j <= 7; j++)
    {
        <input type="hidden" name="Periods.Index" value="@(i * j)" /> 
        @Html.DropDownListFor(m => @Model.Periods, new SelectList(@Model.Items, "Id", "Title", @Model.ScheduleList[i, j]))
    }
}

但是这不适用于您当前的场景。有关索引器的更多信息可以在网上找到 - 例如。在http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/