Автоматически назначать модель представления каждому действию в контроллере - PullRequest
0 голосов
/ 03 марта 2012

Я хотел сделать это в контроллере ...

        protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        (filterContext.Result as ViewResultBase).Model = BindViewModel();

        base.OnActionExecuted(filterContext);
    }

.... но модель не имеет установщика.

Я думаю, что мое представление (которое представляет собой форму, которая после завершения выполняет перенаправление) нуждается в том же наборе данных, чтобы добавить его в раскрывающийся список, будь то первый запрос или обратная связь. Поэтому я не хочу повторять код для привязки данных выпадающего списка.

Есть идеи? Я пытаюсь воссоздать шаблон, который я использовал с WebForms и страницами списка, где я оставляю свой код привязки до PreRender, поэтому независимо от того, какое действие было предпринято ранее в жизненном цикле страницы, в конце стр.

1 Ответ

0 голосов
/ 04 марта 2012

Я попытаюсь ответить на ваш вопрос с примером (за которым следует небольшое объяснение)

Позволяет определить модель как,

public class TestModel
{
    public string SelectedItem { get; set; }

    public IEnumerable<SelectListItem> DropdownItems
    {
        get
        {
            if (Items == null)
                return null;
            return Items.Select(i => new SelectListItem { Text = i, Value = i });
        }
    }

    public IEnumerable<string> Items { get; set; }
}

А в контроллере,

    [HttpGet]
    public ActionResult Index()
    {
        TestModel model = new TestModel();
        model.Items = new List<string> { "A", "B" };

        return View(model);
    }
    [HttpPost]
    public ActionResult Index(TestModel model)
    {
        return View(model);
    }

Теперь в представлении

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
    <legend>TestModel</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.SelectedItem)
    </div>
    <div class="editor-field">
    @for (int i = 0; i < Model.Items.Count(); i++)
    {
        @Html.Hidden("Items["+i+"]",Model.Items.ElementAt(i))
    }
        @Html.DropDownListFor(m=>m.SelectedItem,Model.DropdownItems)
        @Html.ValidationMessageFor(model => model.SelectedItem)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
    </fieldset>
}

Объяснение:

Модель имеет свойство типа IEnumerable Items, которое заполняет свойство DropdownItems.В представлении мы можем установить скрытые поля для элементов, чтобы они заполнялись при каждом запросе публикации. Поэтому нам не нужно устанавливать его снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...