MVC处理部分视图模型中的集合项索引

Tom*_*r W 3 indexing collections asp.net-mvc asp.net-mvc-partialview asp.net-mvc-viewmodel

我有一个带有集合的ViewModel,例如:

public class CreateCampaignViewModel : ControlPanelViewModel
{
    [RequiredField]
    public string Name { get; set; }

    public List<AdvertisementViewModel> Advertisements { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

在视图中,如果我使用它像:

@for (int i = 0; i < Model.Advertisements.Count; i++)
{
  <fieldset style="z-index: 0;">
  <legend>?????</legend>
  <table style="width: 100%;">
    <tr>
      <td>
        <label for="@Html.NameFor(m => m.Advertisements[i].Title)">????? ???????</label></td>
      <td>@Html.TextBoxFor(m => m.Advertisements[i].Title)</td>
    </tr>
  </table>
  </fieldset>
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,当我发布表格时我可以看到列表......

但我想将AdvertisementEditor嵌套在Partial View中,因此我的视图变为:

@for (int i = 0; i < Model.Advertisements.Count; i++)
{
   Html.RenderPartial("AdvertisementEditor", Model.Advertisements[i]);
}
Run Code Online (Sandbox Code Playgroud)

和我的部分:

@model Pushed.Models.AdvertisementViewModel

<fieldset style="z-index: 0;">
    <legend>?????</legend>
    <table style="width: 100%;">
        <tr>
            <td>
                <label for="@Html.NameFor(m => m.Title)">????? ???????</label></td>
                <td>@Html.TextBoxFor(m => m.Title)</td>
        </tr>
    </table>
</fieldset>
Run Code Online (Sandbox Code Playgroud)

我的问题是,现在,当我发布表单时,我没有得到每个广告的TextBox中的值.

这是合乎逻辑的,因为现在我的<input>标签没有'advert [1] .Title'名称,但只有'Title'在我的包含模型中不存在.

我如何创建一个部分反映单个集合项目与它的indecies所以它将正确地重新发布表单?

Tom*_*r W 9

找到了解决方案,不敢相信我之前没有找到这个!

有两种方法可以告诉MVC.NET前缀输入字段:

  1. 创建EditorTemplate而不是PartialView ......它会很有效.

  2. 限定 TemplateInfo.HtmlFieldPrefix

如图所示调用部分视图:

@{ 
  Html.RenderPartial("TargetAudienceParameters", Model.TargetAudienceParameter, 
      new ViewDataDictionary {
           TemplateInfo = new TemplateInfo {
               HtmlFieldPrefix = "Advertisements[4]" // 4 being an example
           } 
      }); 
 }
Run Code Online (Sandbox Code Playgroud)