C# 列表中项目数量可变的模型绑定<;T>;

C# 列表中项目数量可变的模型绑定<;T>;,c#,asp.net,asp.net-mvc,asp.net-mvc-3,model-binding,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Model Binding,我有一个模型,它可以在列表中包含不同数量的项目 在我看来,我有以下几点: @using (Html.BeginForm()) { int count = Model.Data.Filters.Count; for(int i = 0; i < count; i++) { <div> @Html.TextBox("filtervalue" + i) @Html.DropDownList("filteropt

我有一个模型,它可以在
列表中包含不同数量的项目

在我看来,我有以下几点:

@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"])
}
@使用(Html.BeginForm())
{
int count=Model.Data.Filters.count;
for(int i=0;i
在我的控制器中是否有一种方法可以设置POST-action方法以绑定到其中包含可变项的模型

另外,我将如何构建模型来处理这个问题


谢谢

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

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

多亏了编辑器模板,您不再需要在视图中编写任何foreach循环,也不用担心如何命名输入字段,发明一些索引。。。因此,默认模型绑定器在回发时可以识别它们。

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

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

多亏了编辑器模板,您不再需要在视图中编写任何foreach循环,也不用担心如何命名输入字段,发明一些索引。。。这样默认的模型绑定器就可以在回发时识别它们。

我已经看过Scott Hanselman的这篇文章,这可能有用@Jon,是的,如果希望默认模型绑定器工作,那么标记应该是这样的。编辑器模板将生成这样的正确标记。不要与循环和索引纠缠。你将面临艰难的时刻。不需要任何循环。将为集合的每个元素自动调用编辑器模板。ASP.NET MVC认识到筛选器是一个集合,并为您执行此操作。一切都按惯例进行。尊重惯例,你的观点会很漂亮,模型活页夹会有用。。。。。。不过,模板的名称很重要。例如,如果
Filters
属性的类型为
IList
或甚至
IEnumerable
FilterModel[]
您的编辑器模板必须名为
FilterModel.cshtml
,并位于
~/Views/Shared/EditorTemplates
~/Views/SomeControllerName/EditorTemplates
文件夹中。非常感谢。就像你解释的那样。我不知道EditorTemplates是关于新收藏的。你每天都会学到新的东西。我看过斯科特·汉斯曼的这篇文章,可能有用@Jon,是的,如果希望默认模型绑定器工作,那么标记应该是这样的。编辑器模板将生成这样的正确标记。不要与循环和索引纠缠。你将面临艰难的时刻。不需要任何循环。将为集合的每个元素自动调用编辑器模板。ASP.NET MVC认识到筛选器是一个集合,并为您执行此操作。一切都按惯例进行。尊重惯例,你的观点会很漂亮,模型活页夹会有用。。。。。。不过,模板的名称很重要。例如,如果
Filters
属性的类型为
IList
或甚至
IEnumerable
FilterModel[]
您的编辑器模板必须名为
FilterModel.cshtml
,并位于
~/Views/Shared/EditorTemplates
~/Views/SomeControllerName/EditorTemplates
文件夹中。非常感谢。就像你解释的那样。我不知道EditorTemplates是关于新收藏的。你每天都会学到新东西。