Я ненавижу отвечать на свои вопросы, но, основываясь на множестве вопросов, которые я сочетаю с множеством доступных ответов, я подумал, что суммирую свои выводы.
Прежде всего, спасибо за Филиппа, его ответ точно не решил мою проблему, но привел меня в правильном направлении. + 1
Если вы создаете форму для просмотра и редактирования, которая требует раскрывающегося списка, вот несколько советов и ошибок. Я начну со списка параметров, которые мне нужны, чтобы соответствовать моим потребностям.
- Сильно типизированные представления на мой взгляд предпочтительнее. Минимизируйте магические струны.
- Модели представлений должны содержать как можно меньше логических и посторонних элементов. Там только работа должна облегчить сбор объектов данных.
- В раскрывающемся списке должно отображаться выбранное значение.
- Выбранное значение должно легко отображаться обратно в модель представления при отправке формы.
Это может звучать как очевидный и легко доступный список, но для новичка в MVC это не так. Я буду пересматривать мой код сверху с комментариями. Вот что я сделал.
ViewModel.cs
public class ViewModel
{
public ViewModel() {}
public ViewModel(Contact contact, IList<State> states)
{
//no need to pass in a SelectList or IEnumerable, just what your service or repository spits out
this.Contact = contact;
this.States = states;
}
public Contact Contact {get;set;}
public IList<State> States {get;set;}
}
Controller.cs // ничем не отличается от описанного выше
public ActionResult Edit(int id)
{
var contact = _contactService.GetContactById(id);
var states = _stateService.GetAllStates();
return View(new ViewModel(contact, states));
}
public ActionResult Edit(ViewModel viewModel)
{
_contactService.UpdateContact(viewModel.Contact);
return RedirectToAction("Edit", new {id = viewModel.Contact.Id });
}
Просмотр // спасибо Artirto в этом сообщении
@{using (Html.BeginForm("Edit", "Controller", FormMethod.Post))
{
@Html.HiddenFor(m => m.Contact.Id)
@Html.DropDownListFor(m => m.Contact.StateId, new SelectList(Model.States, "Id", "Name", @Model.Contact.StateId))
<input type="submit" value="Save" />
}
}