MVC部分视图隐藏如何前置属性?

时间:2014-08-14 10:00:50

标签: c# asp.net-mvc

由于我理解列表的MVC模型绑定,因此必须在属性的名称前添加属性的名称,否则整个系统无法绑定。 例如:

<input type="text" name="people[0].FirstName" value="George" />

不幸的是,我有以下情况:

public class ProjectEditModel
    {
        public int ID { get; set; }

        public List<ProjectIdea> Ideas { get; set; }

        // huge list of related objects
    }

    public class ProjectIdea
    {
        public int ID { get; set; }

        public string Name { get; set; }
    }

我正在使用一个显示ProjectEditModel的表单,以及一个显示ProjectIdeas的PartialView,这非常复杂,因此我不想将所有内容保存在一个razur视图中。 这看起来像这样:

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(mbox => Model.ID)

        @Html.Partial("AddAnotherProjectIdea", Model.Ideas)

        <div class="form-group">
            <div class="col-md-offset-0 col-md-10">
                <input type="submit" value="@IndexRes.ButtonCreateNew" class="btn btn-primary" />
                @Html.ActionLink(CommonRes.ButtonToIndex, "Index", null, new { @class = "btn btn-primary" })
            </div>
        </div>
    }

和AddAnotherProjectIdea-Partialview:

@model List<Domain.Entities.ProjectIdea>

<div id="IdeaList">
    @for (int i = 0; i < Model.Count(); i++)
    {
        @Html.HiddenFor(mbox => Model[i].ID)

        <div class="form-group">
            @Html.LabelFor(m => Model[i].Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => Model[i].Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => Model[i].Name, "", new { @class = "text-danger" })
            </div>
        </div>
    }
</div>

不幸的是,这个结构会产生一个像这样的编辑器      哪个不绑定到ProjectEditModel,因为&#34; Ideas&#34;名称中缺少名称。手动更改它有效:     

是否有一种简单的方法可以将此Property-Name添加到名称中,还是可以在没有Propertyname的情况下欺骗绑定接受名称?

1 个答案:

答案 0 :(得分:0)

您可以将post方法更改为接受2个参数,视图模型和集合,然后将集合分配给模型

[HttpPost]
public ActionResult(ProjectEditModel model, List<ProjectIdea> collection)
{
  model.Ideas = collection;
  ...