Это должно быть очень легко, и я не могу в жизни понять, что я не нашел ответов на этот вопрос, несмотря на, по крайней мере, час поиска в Google. Во всяком случае, здесь мы идем:
Я хочу создать простое представление ASP.NET MVC с некоторыми раскрывающимися списками, которые позволяют пользователю выбирать некоторые значения, которые затем сохраняются как идентификаторы в базе данных. Поскольку мне сказали, что ViewBag/ViewData - это дьявольская работа, я попытался решить эту проблему, добавив список выбора в мою модель (View), например:
public virtual SelectList Accommodations { get; set; }
а затем в моем контроллере заполните его чем-то вроде:
LoanApplication theLoanApplication = new LoanApplication();
theLoanApplication.Accommodations = new SelectList(db.Accommodations.ToList(), "AccommodationID", "Name");
и, наконец, на мой взгляд, используйте это, чтобы все заработало:
@Html.DropDownListFor(model => model.AccommodationID, Model.Accommodations, "Choose Accommodation")
Это работает так, как должно, но когда я пытаюсь сохранить модель, я получаю сообщение об ошибке, что свойство Accommodations (список) имеет значение null, что вполне ожидаемо. Все остальное в моей модели, как и должно быть.
Я просмотрел хорошо известный пример кода «Университет графства» на сайте ASP.NET, и в нем они, похоже, используют ViewBag для решения подобных проблем. Значит ли это, что ViewBag не так уж плох для использования в подобном сценарии и может быть даже лучшим возможным решением? Если нет, то какой предпочтительный способ решить эту проблему и не использовать ViewBag/ViewData?
Спасибо.
ViewBag
. Почему вы ожидаете, чтоModel.Accommodations
будет заполнено (и использованиеViewBag
все равно не заполнит его). Вы не должны (и не должны) генерировать входные данные для каждого свойства каждогоSelectListItem
в коллекции. Если вам нужно вернуть представление, потому чтоModelState
недопустимо, вы переназначаетеSelectList
свойствуAccommodations
, прежде чем возвращать представление. - person   schedule 14.06.2015SelectList
(или вы добавили это свойство в свою модель данных? - в этом случае нет - принадлежит модели представления) - person   schedule 14.06.2015SelectList
(модель данных не содержит свойстваSelectList
). В контроллере инициализируйте новый экземпляр модели представления и отправьте его в представление. В методе POST инициализируйте новый экземпляр вашей модели данных и сопоставьте с ним свойства модели представления, а затем сохраните модель данных. См. также Что такое ViewModel в MVC? - person   schedule 14.06.2015