Привязка к SelectList в MVC

Еще раз мне противостоят с, "Это не должно быть этим? *! # трудно" ситуация.

Проблема: Я хочу использовать форму в MVC для создания объекта. Один из элементов объекта является рядом ограниченного выбора - идеальный кандидат на выпадающий список.

Но если я использую SelectList в своей модели и выпадающем списке, по моему мнению, и затем пытаюсь отправить Модель назад на мой Создавать метод, я получаю ошибку "Отсутствующий метод Exception:No конструктор Без параметров для этого объекта". Исследуя исходный код MVC, кажется, что для привязки с моделью, Редактор связей должен смочь создать ее сначала, и это не может создать SelectList, потому что нет никакого конструктора по умолчанию для него.

Вот упрощенный код: Для модели:

public class DemoCreateViewModel
{
    public SelectList Choice { get; set; }
}

Для контроллера:

//
// GET: /Demo/Create

public ActionResult Create()
{
    DemoCreateViewModel data = new DemoCreateViewModel();
    data.Choice = new SelectList(new string[] { "Choice1", "Choice2", "Choice3" });
    ViewData.Model = data;
    return View();
}

//
// POST: /Demo/Create

[HttpPost]
public ActionResult Create(DemoCreateViewModel form)
{
    try
    {
        // TODO: Add insert logic here

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

И для представления:

<fieldset>
    <legend>Fields</legend>
    <%= Html.LabelFor(model => model.Choice) %>
    <%= Html.DropDownListFor(model => model.Choice, Model.Choice) %>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>

Теперь, я знаю, что могу СДЕЛАТЬ эту работу путем ронения 10 ярдов и плавание на плоскодонке: обойдите образцовую привязку и роняйте к FormCollection и проверьте и свяжите все поля самостоятельно, но там получен, чтобы быть более простым путем. Я имею в виду, это - почти столь простое требование, как это добирается. Существует ли способ сделать эту работу в архитектуре MVC ModelBinding? Если так, что это? И в противном случае каким образом?

Править: Ну, у меня есть яйцо на моей поверхности, но возможно это поможет кому-то еще. Я сделал еще некоторое экспериментирование и нашел простое решение, которое, кажется, работает.

Обеспечьте простое значение (строка или целое число, в зависимости от того, что Ваш тип значения списка выборки), и назовите это как элемент модели, с которым Вы связываете. Затем обеспечьте второй элемент как список выборки выбора и назовите его чем-то еще. Таким образом, моя модель стала:

public class DemoCreateViewModel
{
    public string Choice { get; set; }
    public SelectList Choices { get; set; }
}

И затем оператор DropDownListFor в Представлении становится:

<%= Html.DropDownListFor(model => model.Choice, Model.Choices) %>

Когда я делаю это, кнопка отправки правильно связывает выбор, сделанный в форме к строковому Выбору, и утверждает, что модель назад к второму Создает метод.

11
задан Samuel Caillerie 12 November 2012 в 14:51
поделиться