Узнав о выпадающих списках, я пытаюсь добавить страницу создания RSVP для nerddinner, как в блоге Скотта Гу с Html.DropDownListFor, в котором перечислены доступные обеды.
Я могу заполнить раскрывающийся список, но не могу получить раскрывающийся список для предварительного выбора нужного значения («Обеденный ужин 2»). Я использую инициализатор, чтобы посеять несколько обеденных предметов в БД. База данных - это sql ce 4 с использованием EF 'code first подхода'. Извините, я знаю, что это очень распространенная проблема, и мне неприятно спрашивать, но, честно говоря, я потратил довольно много времени на это, но не могу заставить ее работать:
ViewModel
public class RSVPViewModel
{
public SelectList DinnersList { get; set; }
public RSVP Rsvp { get; set; }
public string SelectedItem { get; set; }
}
Контроллер
//
//GET: /RSVP/Create
public ActionResult Create()
{
RSVP rsvp = new RSVP();
string selected = "Sample Dinner 2";
var typeList = new SelectList(dbc.Dinners.ToList(), "DinnerID", "Title", selected);
var viewModel = new RSVPViewModel { DinnersList = typeList, Rsvp = rsvp, SelectedItem = selected };
return View("Create", viewModel);
}
Посмотреть
@Html.DropDownListFor(model => model.Rsvp.DinnerID, Model.DinnersList)
HTML Результат
<select data-val="true" data-val-number="The field DinnerID must be a number." data-val-required="The DinnerID field is required." id="Rsvp_DinnerID" name="Rsvp.DinnerID">
<option value="1">Sample Dinner 1</option>
<option value="2">Sample Dinner 2</option>
</select>
Таким образом, предварительный выбор раскрывающегося списка со значением «Образец ужина 2» не выполняется при загрузке страницы. Список отображается нормально и устанавливает правильный DinnerID, когда я делаю выбор и нажимаю Отправить.
Пытается это также:
@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
но не устанавливает или не привязывает к Rsvp.DinnerID.
Это предварительно выбирает из списка, но не привязывает (или не устанавливает Rsvp.DinnerID)
@Html.DropDownList("DinnersList")
Я хочу сохранить его в mvc3, поэтому хочу реализовать его со строгим типом, используя подход ViewModel (без ViewData) и предпочтительно с использованием Html.DropDownListFor (не Html.DropDownList). В этом случае Viewbag кажется ненужным.
Спасибо!
Edit1
Думая, что я должен использовать selectList из selectListItems, я попробовал этот подробный подход:
RSVP rsvp = new RSVP();
string selected = "2";
List<SelectListItem> dinners = new List<SelectListItem>();
foreach (Dinner dinner in dbc.Dinners.ToList())
{
SelectListItem slDinner = new SelectListItem();
slDinner.Value = dinner.DinnerID.ToString();
slDinner.Text = dinner.Title;
slDinner.Selected = (slDinner.Value == selected);
dinners.Add(slDinner);
}
var dinnersList = new SelectList(dinners, "Value", "Text", selected);
var viewModel = new RSVPViewModel { DinnersList = dinnersList, Rsvp = rsvp, SelectedItem = selected };
Однако по-прежнему нет работы. Должен ли я как-то использовать свойство ViewModel SelectedItem в: @ Html.DropDownListFor ..? Что-то вроде:
@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
но как мне получить выбранное значение для установки Rsvp.DinnerID. Я думаю, что это называется обязательным.