MVC4将模型绑定到ICollection或List in partial

时间:2013-02-07 12:18:22

标签: c# asp.net razor asp.net-mvc-4 model-binding

给定模型

public class Task
{
public int TaskId { get; set; }
public string Title { get; set; }
public ICollection<SomeData> Information { get; set; }
}

,其中

public class SomeData
{
    public int SomeDataId { get; set; }
    public string Description { get; set; }
}

我有一个观点

@model myProject.Models.Task

<div>
    @Html.LabelFor(model => model.Title)
</div>

<table>
@Html.Partial("_InformationEdit", Model.Information.ToList(), new ViewDataDictionary(Html.ViewDataContainer.ViewData) {
                TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Information" }})
</table>                    

我的部分是

@model IList<myProject.Models.SomeData>

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

然而

我的Html字段呈现为

<input class="text-box single-line" id="Information__0__Description" name="Information.[0].Description" type="text">

名称应为Information[0].Description。它有一个额外的点,所以在发布时没有正确绑定到模型。我该如何解决这个问题?

根据 Model binding to a list ,我可以看到我的Id应该是什么,但我无法弄清楚正确的语法。

此外,使用IEnumerable使用@foreach是否有更优雅的方法来实现这一目标?

相关:

ASP.Net MVC4 bind a "create view" to a model that contains List

ASP.NET MVC model binding an IList<> parameter

3 个答案:

答案 0 :(得分:1)

您可以直接使用<input...

网页:

<table>
    @Html.Partial("_InformationEdit", Model.Information)
</table>

部分页面

@for (int i = 0; i < Model.Count(); i++)
{
    <tr>
        <td>
            <input class="text-box single-line" id="Information[@i]Description" name="Information[@i].Description" type="text" value="@Model[i].Description" />
        </td>
    </tr>
}

或者,为了能够在示例中传递前缀,您可以保持页面代码相同并更改您的部分:

网页:

<table>        
    @Html.Partial("_InformationEdit", Model.Information, 
        new ViewDataDictionary(Html.ViewDataContainer.ViewData) 
        {
            TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Information" }
        })
</table>

部分页面

@for (int i = 0; i < Model.Count(); i++)
{
    <tr>
        <td>
            @{
                string fieldName = string.Format("{0}[{1}].Description", ViewData.TemplateInfo.HtmlFieldPrefix, i);
                <input class="text-box single-line" id="@fieldName" name="@fieldName" type="text" value="@Model[i].Description" />
            }
        </td>
    </tr>
}

答案 1 :(得分:1)

将我的部分改为

@model IList<myProject.Models.SomeData>

@{
    var Information = Model;
}

@for (int i = 0; i < Information.Count(); i++)
{
    <tr>
        <td>
            @Html.EditorFor(modelItem => Information[i].Description)
        </td>
    </tr>
 }

工作,但这似乎有点奇怪!

我想确保被绑定的对象与它需要绑定的属性具有相同的名称做一些魔法......欢迎其他建议或解释!

答案 2 :(得分:1)

你的部分应该是:

@model IList<myProject.Models.SomeData>

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

如果用项目名称

替换i,也会更容易阅读