C# 使用列表时未更新模型

C# 使用列表时未更新模型,c#,asp.net-mvc,asp.net-mvc-4,model-view-controller,C#,Asp.net Mvc,Asp.net Mvc 4,Model View Controller,我有一个属性类型为List的模型。我使用此属性在视图上显示值。我使用foreach循环遍历列表中的每个项目,并使用DisplayFor和TextBoxFor显示它们。那部分工作正常;我以前使用过TextBoxFor,任何用户输入的文本在提交时都会通过模型。但是,在使用列表时,提交表单时列表为空。模型中的所有其他属性都已更新,我可以正确访问它们。什么是阻止列表绑定的原因?如何修复此问题 ModelInstrumentListingDetail public class ModelInstrumen

我有一个属性类型为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; }
}
看法


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

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

也许可以试试:

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

我想我之前也有类似的问题

也许可以试试:

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

按如下方式更改循环:

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

默认的ASP.NET MVC模型绑定器将从请求正文中拾取这些
,并将它们应用于viewmodel,在您的示例中是
ModelInstrumentingListingDetail。项
将循环更改如下:

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

默认的ASP.NET MVC模型绑定器将从请求正文中选择这些
,并将它们应用于viewmodel,在您的例子中是
ModelInstrumentingListingDetail.Items

如果您想正确绑定列表,您应该使用
EditorTemplates
EditorFor
帮助程序或
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(int i=0;iModel.items[i].Label)
@Html.TextBoxFor(m=>Model.items[i].Field)
}

for
循环-方法很短,但使用
EditorTemplate
-更干净的解决方案,因此我建议您使用
EditorTemplates
EditorFor
帮助程序或
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(int i=0;iModel.items[i].Label)
@Html.TextBoxFor(m=>Model.items[i].Field)
}

for
循环-方法很短,但使用
EditorTemplate
-更干净的解决方案,因此我推荐它

此循环的可能副本非常有效。多谢各位,;你帮我省了好几个小时的工作(还有我老板给我的很多痛苦)。给你几个问题:1。这似乎是一个“黑客”;这就是你在MVC中要让它“正确”工作的方法吗?2.我们的办公室已经从asp.net切换到MVC,这里没有人接受过任何MVC培训。我很想学习如何做这样的事情,而不必张贴一个问题,并希望有人回答它。我读过一些关于MVC的书,但它们通常只展示基本知识。你能推荐一些资源让我学习你给我看的东西吗?不,这不是一种黑客行为,这是一种非常标准的方式将项目发布到控制器,就像模型绑定器知道它们属于列表一样。至于资源,我所知道的关于MVC的大部分内容都是从StackOverflow中获得的。我问了一些问题,也看了达林·迪米特里奥夫的回答,从他的回答中我学到了很多。很高兴我能帮忙:)这工作做得很好。多谢各位,;你帮我省了好几个小时的工作(还有我老板给我的很多痛苦)。给你几个问题:1。这似乎是一个“黑客”;这就是你在MVC中要让它“正确”工作的方法吗?2.我们的办公室已经从asp.net切换到MVC,这里没有人接受过任何MVC培训。我很想学习如何做这样的事情,而不必张贴一个问题,并希望有人回答它。我读过一些关于MVC的书,但它们通常只展示基本知识。你能推荐一些资源让我学习你给我看的东西吗?不,这不是一种黑客行为,这是一种非常标准的方式将项目发布到控制器,就像模型绑定器知道它们属于列表一样。至于资源,我所知道的关于MVC的大部分内容都是从StackOverflow中获得的。我问了一些问题,也看了达林·迪米特里奥夫的回答,从他的回答中我学到了很多。很高兴我能帮忙:)谢谢你的回复。这对我不起作用。创建的HTML对每个输入标记使用相同的名称和id。也许这就是它不起作用的原因?想让他们用不同的名字吗?这是HTML:谢谢你的回复。这对我不起作用。创建的HTML对每个输入标记使用相同的名称和id。也许这就是它不起作用的原因?想让他们用不同的名字吗?这是HTML:谢谢你的回复。for循环工作得很好。我尝试了EditorTemplate,但它没有将值绑定到模型(当它到达控制器时,项仍然为null)。我怀疑我需要使用for循环(而不是foreach)的一些组合,使用项上的索引和EditorTemplate。我也不完全确定我是否正确设置了EditorTemplate。我设置了ModelInstrumentListingItem类型的cshtml视图,其中有一个textboxfor model.field。然后,我向ModelInstrumentListingItem添加了一个UIHint。我想在我尝试使用它之前,我需要调查更多的编辑器或模板。谢谢你的回复。for循环工作得很好。我尝试了EditorTemplate,但它没有将值绑定到模型(当它到达控制器时,项仍然为null)。我怀疑我需要使用for循环(而不是foreach)的一些组合,使用项上的索引和EditorTemplate。我也不完全确定我是否正确设置了EditorTemplate。我设置了ModelInstrumentListingItem类型的cshtml视图,其中有一个textboxfor model.field
  @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>
   }