2011-03-18 26 views
11

Tengo problemas para lograr que mi DropDownList establezca el elemento seleccionado según el valor del modelo.MVC DropDownListFor() El elemento seleccionado no está seleccionado/requerido La validación no se ejecutó

El campo en el modelo es solo una cadena para el título del nombre de los usuarios (Sr., señorita, etc.) A continuación está mi código hasta ahora.

<td> 
@{ var list = new List<SelectListItem>(new[] {      
    new SelectListItem{ Selected = string.IsNullOrEmpty(Model.Title), Text="",Value=""}, 
    new SelectListItem{ Selected = Model.Title.Equals("Mr"), Text="Mr",Value="Mr"}, 
    new SelectListItem{ Selected = Model.Title.Equals("Mrs"), Text="Mrs",Value="Mrs"}, 
    new SelectListItem{ Selected = Model.Title.Equals("Miss"), Text="Miss",Value="Miss"}, 
    new SelectListItem{Selected = Model.Title.Equals("Ms"), Text="Ms",Value="Ms"}  
    }); 
} 
@Html.DropDownListFor(m=>m.Title, list) 
</td> 
+0

¿Intentó usar var list = new SelectList (...)? porque algo como esto me funciona: Html.DropDownListFor (m => m.Title, nueva SelectList (nueva cadena [] {"Seleccionar título", "Mr", "Miss"}, "Mr")); (selecciona Mr) – Spikolynn

+0

¿puedes usar el depurador para confirmar que Seleccionado se establece en verdadero en uno de estos elementos? –

Respuesta

12

Así que resulta que la única razón por la que no funciona es porque mi nombre de campo es el título, lo cambié a prefijo y funciona mi código exacto. Demasiado tiempo dedicado a descubrirlo ...

Aquí está el código de trabajo.

<td> 
    @{ var list = new List<SelectListItem>(new[] { 
     new SelectListItem { 
      Selected = string.IsNullOrEmpty(Model.Prefix), 
      Text="", 
      Value="" 
     }, 
     new SelectListItem { 
      Selected = Model.Prefix.Equals("Mr"), 
      Text="Mr", 
      Value="Mr" 
     }, 
     new SelectListItem { 
      Selected = Model.Prefix.Equals("Mrs"), 
      Text="Mrs", 
      Value="Mrs" 
     }, 
     new SelectListItem { 
      Selected = Model.Prefix.Equals("Miss"), 
      Text="Miss", 
      Value="Miss" 
     }, 
     new SelectListItem { 
      Selected = Model.Prefix.Equals("Ms"), 
      Text="Ms", 
      Value="Ms" 
     }  
     }); 
    } 
    @Html.DropDownListFor(m => m.Prefix, list) 
</td> 
+2

Es porque probablemente ya esté usando una propiedad llamada Título en su ViewBag/ViewData. Recomiendo cambiar su nombre de propiedad ViewBag/ViewData, no el nombre de propiedad de su modelo. De hecho, deja de usar ViewBag/ViewData porque es horrible :) –

+0

Muchas gracias, tuve el mismo problema y me estaba volviendo loco. – tsimbalar

+0

@JamesMcCormack "horrible" es un término tan bueno. ¿Cómo deberíamos enviar otros datos a nuestros puntos de vista que no forman parte de nuestro modelo fuertemente tipado? – iGanja

21

he tenido este problema con MVC 3 y resultó que me había propuesto ViewBag.Title en mi punto de vista (de usarla por título de la página). Tan pronto como lo cambié a ViewBag.PageTitle, el código del dropdownlist comenzó a trabajar: @Html.DropDownListFor(model => model.Title, Model.MySelectList)

La razón de esto es que en MVC 2/3, propiedades de cualquier ViewBag/ViewData con el mismo nombre que los de el objeto Modelo se usa con preferencia en DropDownListFor(), por lo que debe cambiarles el nombre para asegurarse de que no entren en conflicto. Debido a que parece realmente escamoso, simplemente dejé de usar ViewBag por completo y ahora solo confío en el modelo de visualización para pasar cosas a la vista.

La razón de este problema es tan frecuente es que ViewBag.Title se utiliza en muchos tutoriales de introducción y el código de prueba para establecer el elemento de título HTML, por lo que, inevitablemente, se adoptó como un enfoque de "mejores prácticas". Sin embargo, Título es un nombre de propiedad de modelo natural para su uso en menús desplegables en una vista de "Detalles de usuario".

+2

Amigo, eres increíble. Esto resolvió el problema para mí perfectamente. ¡Muchas gracias! –

+3

Creo que esto es un error en MVC3. Cualquier cosa en las claves ViewData que tenga el mismo nombre de propiedad del Modelo causaría este problema. Gracias, salvaste mi día +1 –

+0

¡Gracias! Casi pierdo tanto tiempo con esto. – GrantVS

Cuestiones relacionadas