2015-12-28 149 views
0

我有一个数组,我想绑定到一个下拉列表。下面是代码:ASP.NET MVC绑定数组DropDownFor

@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数组绑定到下拉列表并将它传递给另一个数组?

+0

很难理解你试图达到什么结果,你想要5 * 7 = 35下拉? –

+0

是的,我想要保存到数据库的35个下拉列表,以后用户可以编辑它们。 In @ Model.ScheduleList我有数据库中的值,但我无法更改生成的选择输入以显示默认的第一个元素 – snaksa

+1

'@ Model.Periods [i * 10 + j]'几乎'正确 - 如果任何期间[X](其中X从0到34包括在内)中的任何一个将会丢失,则您必须使用期间[0]至期间[34]中的所有值回传该数据没有收到正确的数据。数组的索引应严格从0开始。因此,@ @ Model.Periods [(i-1)* 10 +(j-1)]'应该没问题。 –

回答

1

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

如果Periods[X](其中X从0到34包括在内)中的任何一个都将丢失,您将不会收到正确的数据。

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

将被绑定到以下数组:还数组的索引应当严格从0

因此,例如启动[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/