9

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

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

Тогда я рендеринг моего DropDownListFor, как следовать в моих View:

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

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

+1

Не делайте этого - это вызывает проблемы (например, вы не можете получить какую-либо проверку на стороне клиента) –

+0

@StephenMuecke clien валидация на что? ViewBag не имеет какой-либо проверки –

+0

@teovankot, по свойству модели 'CustomerID' - при использовании OP не будут генерироваться атрибуты' data-val- * ', а пользователь выбирает первый вариант« пожалуйста, выберите », no будет отображаться ошибка проверки (когда это должно быть - предполагается, что 'CustomerID' - typeof' int') –

ответ

9

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

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

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

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

+0

нормально, вы везде –

+0

Ошибка в скрипке, когда я нажимаю кнопку отправки. В нем говорится: «Элемент ViewData, который имеет ключ« CustomerA », имеет тип« System.Int32 », но должен иметь тип« IEnumerable ».» – Saurabh

+0

@Saurabh. Это потому, что я не заселял 'SelectLists' в POST перед возвратом представления (в соответствии с методом GET) - но это не является точкой скрипта - его показать, что вы не можете получить правильную двустороннюю привязку и/или проверку, если одно и то же имя используется для свойства, которое вы связываете to и 'SelectList' (и если вы хотите получить более подробную информацию об этой ошибке, обратитесь [этот вопрос/ответ] (https://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key -xxx-это-из-типа системы int32-но-должна-быть-о) –

1

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

+0

@ US3-57384, можете ли вы придумать больше? –

+0

Посмотрите, что я использую в своем коде. которые решают вашу проблему и прекрасно работают. (IEnumerable ) ViewBag.RT – CrazyDev

Смежные вопросы