net mvc how from example data asp asp.net asp.net-mvc asp.net-mvc-4 html-helper html.dropdownlistfor

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.