asp.net - how - viewbag in view mvc
¿Puede el nombre de ViewBag ser el mismo que el nombre de la propiedad Modelo en una DropDownList? (2)
Estoy trabajando en una aplicación web ASP.NET MVC-4.
Estoy definiendo lo siguiente dentro de mi método de acción para construir una
SelectList
:
ViewBag.CustomerID = new SelectList(db.CustomerSyncs, "CustomerID", "Name");
Luego estoy renderizando mi
DropDownListFor
como sigue dentro de mi
View
:
@Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.CustomerID, "please select")
Como se muestra, estoy nombrando la propiedad
ViewBag
para que sea igual al nombre de la propiedad
Model
, que es
CustomerID
.
Según mis propias pruebas, definir el mismo nombre no causó ningún problema o conflicto, pero ¿debería evitar esto?
No debe usar el mismo nombre para la propiedad del modelo y la propiedad
ViewBag
(e idealmente no debería usar
ViewBag
en absoluto, sino un modelo de vista con una
IEnumerable<SelectListItem>
).
Al usar
@Html.DropDownListFor(m => m.CustomerId, ....)
la primera opción
"Please Select"
siempre se seleccionará incluso si el valor de la propiedad del modelo se ha establecido y coincide con una de las opciones.
La razón es que el método primero genera un nuevo
IEnumerable<SelectListItem>
basado en el que ha proporcionado para establecer el valor de la propiedad
Selected
.
Para establecer la propiedad
Selected
, lee el valor de
CustomerID
de
ViewData
, y el primero que encuentra es
"IEnumerable<SelectListItem>"
(no el valor de la propiedad del modelo) y no puede hacer coincidir esa cadena con ninguna de sus opciones, entonces se selecciona la primera opción (porque algo tiene que ser).
Al usar
@Html.DropDownList("CustomerId", ....)
, no se generarán atributos
data-val-*
y no obtendrá ninguna validación del lado del cliente
Consulte
este DotNetFiddle que
muestra una comparación de posibles casos de uso.
Solo mediante el uso de diferentes nombres para la propiedad del modelo y la propiedad
ViewBag
todo funcionará correctamente.
No hay daño en usarlo. No obtendrás ningún error. pero la mejor práctica es vincular la propiedad del modelo.