Может ли имя ViewBag совпадать с именем свойства Model в DropDownList?

Я работаю над веб-приложением ASP.NET MVC-4. Я определяю следующее в моем методе действия, чтобы построить SelectList:

ViewBag.CustomerID = new SelectList(db.CustomerSyncs, "CustomerID", "Name");

Тогда я оказываю DropDownListFor как следовать внутри моего View:

 @Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.CustomerID, "please select")

Как показано, я называю ViewBag свойство быть равным Model имя свойства, которое CustomerID, Исходя из моего собственного тестирования, определение одного и того же имени не вызвало проблем или конфликтов, но стоит ли этого избегать?

2 ответа

Решение

Вы не должны использовать одно и то же имя для свойства модели и ViewBag свойство (и в идеале вы не должны использовать ViewBag на всех, а скорее модель представления с IEnumerable<SelectListItem> имущество).

Когда используешь @Html.DropDownListFor(m => m.CustomerId, ....) первый "Please Select" Параметр всегда будет выбран, даже если значение свойства модели установлено и соответствует одному из параметров. Причина в том, что метод сначала генерирует новый IEnumerable<SelectListItem> на основе того, который вы предоставили, чтобы установить значение Selected имущество. Для того, чтобы установить Selected свойство, оно читает значение CustomerID от ViewDataи первый найденный "IEnumerable<SelectListItem>" (не значение свойства модели) и не может сопоставить эту строку ни с одним из ваших параметров, поэтому выбирается первый параметр (потому что что-то должно быть).

Когда используешь @Html.DropDownList("CustomerId", ....)нет data-val-* атрибуты будут сгенерированы, и вы не получите никакой проверки на стороне клиента

Обратитесь к этому DotNetFiddle, показывая сравнение возможных вариантов использования. Только используя разные имена для свойства модели и ViewBag свойство будет все работать правильно.

Там нет вреда, чтобы использовать его. Вы не получите никакой ошибки. но лучшая практика - связывать свойство модели.

Другие вопросы по тегам