2011-09-15 1 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"]) 
} 

и внутри шаблона редактора (~/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 петель в ваших взглядах или беспокоиться о том, как называть поля ввода, придумывают некоторые индексируются, ... так что модель по умолчанию Связыватель распознает их на постбэк.

+0

Я видел это у Скотта Гензельмана, который может работать? http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx – Jon

+0

Не будет ли необходимость иметь цикл в шаблоне редактора – Jon

+0

@ Jon, да, вот как должна выглядеть ваша разметка, если вы хотите, чтобы стандартное связующее работать. Шаблоны редакторов будут генерировать такую ​​правильную разметку. Не пытайтесь бороться с циклами и индексами. У вас будут трудные времена перед вами. Там не будет необходимости в цикле. Шаблон редактора будет автоматически вызываться для каждого элемента коллекции. ASP.NET MVC распознает, что фильтры - это коллекция и делает это за вас. Все работает на условностях. Уважайте соглашения, и ваши взгляды будут хорошенькими, и модельное связующее будет работать ... –

 Смежные вопросы

  • Нет связанных вопросов^_^