使用List时模型未更新

时间:2015-07-14 21:04:36

标签: c# asp.net-mvc asp.net-mvc-4 model-view-controller

我有一个具有List类型属性的模型。我使用此属性在我的视图上显示值。我使用foreach循环遍历列表中的每个项目并使用DisplayFor和TextBoxFor显示它们。那部分工作正常;之前我使用过TextBoxFor,任何用户输入的文本都会在提交时转到模型。但是,使用列表时,提交表单时列表为空。模型中的所有其他属性都已更新,我可以正确访问它们。什么阻止列表绑定,我该如何解决?

ModelInstrumentListingDetail

public class ModelInstrumentListingDetail
{
    public int InstrumentTagID { get; set; }
    public string InstrumentTagDescription { get; set; }

    public List<ModelInstrumentListingItem> items { get; set; }
}

ModelInstrumentListingItem

public class ModelInstrumentListingItem
{
    public string Field { get; set; }
    public string Label { get; set; }
}

查看

@model GPC.Models.ModelInstrumentListingDetail

@using (Html.BeginForm("InstrumentListingAdd", "Home", FormMethod.Post, new { id = "InstrumentListingDetailForm" }))
{
  <table>
   <tr>
    <td>
         @Html.TextBoxFor(m => m.InstrumentTagDescription)
    </td>
   </tr>

  @foreach (GPC.Models.ModelInstrumentListingItem item in Model.items)
  {
   <tr>
      <td>
          @Html.DisplayFor(m => item.Label)
      </td>
      <td>
          @Html.TextBoxFor(m => item.Field)
      </td>
   </tr>
   }
</table>
<input id="submitInstrumentListingAdd" name="submitInstrumentListingAdd" value="Add" type="submit" class="SaveButton" />
}

控制器

[HttpPost]
public ActionResult InstrumentListingAdd(ModelInstrumentListingDetail model, string submitInstrumentListingAdd)
{
  ...
}

在提交时,发布到控制器的模型的InstrumentDescription具有值,但items为null。我需要弄清楚如何使用新值填充项目。

3 个答案:

答案 0 :(得分:3)

像这样更改循环:

@for(int idx = 0;idx < Model.items.Count;idx++)
{
    <tr>
         <td>
            @Html.DisplayFor(_ => Model.items[idx].Label)
         </td>
         <td>
             @Html.TextBoxFor(_ => Model.items[idx].Field)
         </td>
     </tr>
}

这样做的原因是<input>元素将如下生成:

<input id="Items_0_" name="Items[0]" type="text" value="Foo"> <input id="Items_1_" name="Items[1]" type="text" value="Bar">

当您发布数据时,正如以下内容将在正文中:

Items[0]:Foo
Items[1]:Bar

默认的ASP.NET MVC模型绑定器将从请求正文中选择这些Items并将它们应用于viewmodel,在您的情况下ModelInstrumentListingDetail.items

答案 1 :(得分:1)

如果要正确绑定列表,则应使用EditorTemplatesEditorFor助手或for循环。 Here is an example.

如果您使用for循环,它应该是这样的:

  @for (int i = 0; i< Model.items.Count(); i++)
  {
   <tr>
      <td>
          @Html.DisplayFor(m => Model.items[i].Label)
      </td>
      <td>
          @Html.TextBoxFor(m => Model.items[i].Field)
      </td>
   </tr>
   }

for循环 - 简短的方法,但使用EditorTemplate - 更干净的解决方案,所以我推荐

答案 2 :(得分:0)

我想我之前遇到过类似的问题。

也许试试:

[HttpPost]
public ActionResult InstrumentListingAdd([Bind(Prefix = "item")]ModelInstrumentListingItem model, string submitInstrumentListingAdd)
{
  ...
}