Привязка модели с переменным количеством элементов в списке <T> - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть модель, которая может иметь переменное количество элементов в 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 Ответ

4 голосов
/ 15 сентября 2011

Вы можете использовать шаблоны редактора, это будет намного проще:

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

...