Еще раз мне противостоят с, "Это не должно быть этим? *! # трудно" ситуация.
Проблема: Я хочу использовать форму в 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) %>
Когда я делаю это, кнопка отправки правильно связывает выбор, сделанный в форме к строковому Выбору, и утверждает, что модель назад к второму Создает метод.