【问题标题】:ASP.NET MVC Binding array to DropDownForASP.NET MVC 绑定数组到 DropDownFor
【发布时间】:2015-12-28 19:59:25
【问题描述】:

我有一个要绑定到下拉列表的数组。代码如下:

@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]

正在显示选定的值,但生成的 select 输入的名称例如 Periods[34],而不仅仅是 Periods,我在我的视图模型中得到 null回发。 所以我的问题是:如何将一个普通数组绑定到下拉列表并将所选值与另一个数组一起传递?

【问题讨论】:

  • 很难理解你想要达到什么结果,你想要 5 * 7 = 35 个下拉菜单?
  • 是的,我想要将 35 个下拉菜单保存到数据库中,然后用户可以对其进行编辑。在@Model.ScheduleList 我有来自数据库的值,但我无法更改生成的选择输入以显示默认第一个元素的插入
  • @Model.Periods[i*10 + j] '几乎' 正确 - 要回发该数据,您必须使用从 Periods[0] 到 Periods[34] 的所有值,如果有任何 Periods[X] (其中 X 包括从 0 到 34)将丢失,您将不会收到正确的数据。数组的索引也应该严格从 0 开始。所以@Model.Periods[(i-1)*10 + (j-1)] 应该没问题。
  • 你完全正确!也许您可以将其写在单独的答案中,以便我可以标记它:)

标签: asp.net-mvc


【解决方案1】:

@Model.Periods[i*10 + j] 不是 100% 正确 - 要将数据发布到您的控制器,您必须将所有值从 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/

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 2013-05-27
    • 2011-01-06
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多