2011-09-15 37 views
0

我能有一個項目在一個List<T>模型項目的數目可變綁定在列表<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動作方法綁定到模型中的變量項目?

另外,我將如何構建模型來應對這種情況?

感謝

回答

4

您coud使用編輯模板,這將是容易得多:

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

並會自動呈現爲Model.Data.Filters集合中的每個元素的編輯模板(~/View/Shared/EditorTemplates/FilterModel.cshtml)內:

@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循環在你的意見或擔心如何命名輸入字段,發明一些索引,......使默認模型綁定承認他們在回發。

+0

我見過這個由斯科特Hanselman可能工作? http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx – Jon

+0

不需要在編輯器模板中有一個循環 – Jon

+0

@Jon,是的,如果你想使用默認的模型綁定器,你的標記應該是這樣的上班。編輯器模板將生成正確的標記。不要糾結於循環和索引。你將面臨困難時期。不會有任何需要循環。編輯器模板將爲集合的每個元素自動調用。 ASP.NET MVC認識到Filters是一個集合,併爲您做到這一點。一切都適用於約定。遵守慣例,你的意見將是非常漂亮,模型聯編程序將工作... –

相關問題