将List <string []>模型从表单传递回操作方法</string []>

时间:2013-02-14 15:30:50

标签: asp.net razor asp.net-mvc-4

我有一个由List模型组成的表单。当表单提交回action方法时,列表为null。我该怎么设置呢?

public ActionResult PendingRenewals()
{
    //get list elements
    var customers = get customer that match our criteria;

    //Build list
    List<string[]> renewals = new List<string[]>();
    foreach(var item in customers)
    {
        renewals.Add(new string[] {item.name, item.id, item.PO });
    }
    return View(renewals);
}

查看

   @model List<string[]>
   @using (Html.BeginForm()
   {
       <input type="submit" value="Save"/>
       <table>
           @foreach (var item in Model)
           {
               <tr>
                   <td>item[0]</td>
                   <td>item[1]</td>
                   <td>@Html.EditorFor(model => item[2])</td>
                   </td>
               </tr>
           }
    </table>
}

返回控制器

[HttpPost]
public ActionResult PendingRenewals(List<string[]> renewal, string EntityId)
{
    //renewals is always null
    return PendingRenewals();
}

解决方案

使用FortyTwo的想法,我使用字符串[] []作为模型,因此视图看起来像这样(model [i] [0])和model [i] [1]是我需要传回的字段到控制器):

            @model string[][]
            @for (int i = 0; i < Model.Length; i++ )
            {
            <tr>
                <td>@Model[i][2]</td>
                <td>@Model[i][3]</td>
                <td>@Model[i][4]</td>
                <td>@Model[i][5]</td>
                <td>@Html.HiddenFor(model => model[i][0]) @Html.TextBoxFor(model => Model[i][1])</td>
            </tr>
        }

2 个答案:

答案 0 :(得分:1)

您需要使用旧式for循环。这样,索引器用于遵守mvc模型绑定器所需的命名约定。

@for (int i = 0; i < Model.Count; i++)
       {
           <tr>
               <td>Model[i].item[0]</td>
               <td>Model[i].item[1]</td>
               <td>@Html.EditorFor(model => model[i].item[2])</td>
               </td>
           </tr>
       }

答案 1 :(得分:0)

FortyTwo是正确的,您需要使用索引来获取模型绑定器的正确表单数据,但我不认为即使您这样做,模型绑定器也能够理解您从中发布的数据形式。

无论哪种方式,不是使用字符串数组列表,更好的方法是创建“客户”类型,将模型设置为客户列表,并为客户的属性创建编辑器类型。