模型绑定与List <t> </t>中可变数量的项目

时间:2011-09-15 13:33:05

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

我的模型可以在List<T>

中包含可变数量的项目

在我看来,我有以下内容:

@using (Html.BeginForm())
{
    int count = Model.Data.Filters.Count;
    for(int i = 0; i < count; i++)
    {
        <div>

        @Html.TextBox("filtervalue" + i)
        @Html.DropDownList("filteroptions"+i,Model.Data.Filters[i].FilterOptions)


        </div>
    }
    @Html.Hidden("LinkID", Url.RequestContext.RouteData.Values["id"])
}

我的控制器中是否有一种方法可以设置POST操作方法以绑定到包含可变项的模型?

另外,我将如何构建模型以应对此问题?

由于

1 个答案:

答案 0 :(得分:4)

您可以使用编辑器模板,这将更容易:

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Data.Filters)
    @Html.Hidden("LinkID", Url.RequestContext.RouteData.Values["id"])
}

并在编辑器模板(~/View/Shared/EditorTemplates/FilterModel.cshtml)内部,它将自动为Model.Data.Filters集合的每个元素呈现:

@model FilterModel
<div>
    @Html.TextBoxFor(x => x.FilterValue)
    @Html.DropDownListFor(x => x.SelectedFilterOption, Model.FilterOptions)
</div>

现在你的POST控制器动作将如下所示:

[HttpPost]
public ActionResult Foo(SomeViewModel model)
{
    // model.Data.Filters will be properly bound here
    ...
}

感谢编辑器模板,您不再需要在视图中编写任何foreach循环,或者担心如何命名输入字段,发明一些索引,...以便默认模型绑定器在回发时识别它们。

相关问题