Probé que este es RC1 y luego actualicé a RC2, que no resolvió el problema.
// in my controller
ViewData["UserId"] = new SelectList(
users,
"UserId",
"DisplayName",
selectedUserId.Value); // this has a value
resultado: la propiedad SelectedValue se establece en el objeto
// in my view
<%=Html.DropDownList("UserId", (SelectList)ViewData["UserId"])%>
resultado: todas las opciones esperadas se muestran al cliente, pero el atributo seleccionado no se establece. El elemento de SelectedValue existe dentro de la lista, pero el primer elemento de la lista siempre está predeterminado como seleccionado.
¿Cómo debería hacer esto?
Actualización Gracias a la respuesta de John Feminella descubrí cuál es el problema. "UserId" es una propiedad en el modelo en el que se escribe fuertemente mi vista. Cuando Html.DropDownList ("UserId" se cambia a cualquier otro nombre que no sea "UserId", el valor seleccionado se representa correctamente.
Sin embargo, esto da como resultado que el valor no esté vinculado al modelo.
fuente
Respuestas:
Así es como solucioné este problema:
Tuve lo siguiente:
Controlador:
Ver
Cambiado por lo siguiente:
Ver
Parece que el DropDown no debe tener el mismo nombre que el nombre ViewData: S extraño pero funcionó.
fuente
Prueba esto:
Y entonces:
Con MVC RC2, obtengo:
fuente
Aún puede nombrar el DropDown como "UserId" y aún hacer que el enlace del modelo funcione correctamente para usted.
El único requisito para que esto funcione es que la clave ViewData que contiene SelectList no tenga el mismo nombre que la propiedad Model que desea vincular. En su caso específico, esto sería:
Esto producirá un elemento de selección que se llama UserId, que tiene el mismo nombre que la propiedad UserId en su modelo y, por lo tanto, el enlazador de modelos lo establecerá con el valor seleccionado en el elemento de selección de html generado por el ayudante Html.DropDownList.
No estoy seguro de por qué ese constructor Html.DropDownList en particular no seleccionará el valor especificado en SelectList cuando pones la lista de selección en ViewData con una clave igual al nombre de la propiedad. Sospecho que tiene algo que ver con la forma en que se usa el asistente DropDownList en otros escenarios, donde la convención es que tiene una SelectList en ViewData con el mismo nombre que la propiedad en su modelo. Esto funcionará correctamente:
fuente
Si no creemos que este sea un error que el equipo debería corregir, al menos MSDN debería mejorar el documento. La confusión proviene realmente del mal documento de esto. En MSDN , explica el nombre de los parámetros como,
Esto solo significa que el html final que genera usará ese parámetro como el nombre de la entrada seleccionada. Pero, en realidad, significa más que eso.
Supongo que el diseñador asume que el usuario usará un modelo de vista para mostrar la lista desplegable, y también usará la publicación de regreso al mismo modelo de vista. Pero en muchos casos, realmente no seguimos esa suposición.
Utilice el ejemplo anterior,
Si seguimos la suposición, deberíamos definir un modelo de vista para esta vista relacionada con la lista desplegable
Porque cuando se publica, solo se publicará el valor seleccionado, por lo que se asume que se debe publicar en la propiedad del modelo SelectedPersonId, lo que significa que el primer nombre de parámetro de Html.DropDownList debe ser 'SelectedPersonId'. Por lo tanto, el diseñador piensa que cuando se muestra la vista del modelo en la vista, la propiedad del modelo SelectedPersonId debería contener el valor predeterminado de esa lista desplegable. Incluso aunque su Lista <SelectListItem> Personas ya haya configurado el indicador Seleccionado para indicar cuál está seleccionado / predeterminado, tml.DropDownList lo ignorará y reconstruirá su propio IEnumerable <SelectListItem> y establecerá el elemento predeterminado / seleccionado según el nombre.
Aquí está el código de asp.net mvc
Entonces, el código en realidad fue más allá, no solo intenta buscar el nombre en el modelo, sino también en los datos de vista, tan pronto como encuentre uno, reconstruirá la lista de selección e ignorará su Seleccionado original.
El problema es que, en muchos casos, realmente no lo usamos de esa manera. solo queremos incluir una lista de selección con uno o varios elementos seleccionados como verdadero.
Por supuesto, la solución es simple, use un nombre que no esté en el modelo ni en los datos de vista. Cuando no puede encontrar una coincidencia, utilizará la lista de selección original y la selección original tendrá efecto.
Pero sigo pensando que MVC debería mejorarlo agregando una condición más
Porque, si la selectList original ya ha tenido una seleccionada, ¿por qué ignoraría eso?
Solo mis pensamientos.
fuente
El código de la publicación anterior de MVC 3 no funciona, pero es un buen comienzo. Yo lo arreglare. Probé este código y funciona en MVC 3 Razor C # Este código usa el patrón ViewModel para completar una propiedad que devuelve un
List<SelectListItem>
.La clase modelo
La clase ViewModel
El método del controlador
La vista
La salida HTML será algo como
dependiendo de cómo formatee la salida. Espero que esto ayude. El código funciona.
fuente
selected
opción.Esto parece ser un error en la clase SelectExtensions ya que solo verificará ViewData en lugar del modelo para el elemento seleccionado. Entonces, el truco consiste en copiar el elemento seleccionado del modelo en la colección ViewData con el nombre de la propiedad.
Esto se toma de la respuesta que di en los foros de MVC, también tengo una respuesta más completa en una publicación de blog que usa el atributo DropDownList de Kazi ...
Dado un modelo
y un modelo de vista básico de
Luego escribimos una plantilla de editor DropDownList de la siguiente manera ...
Esto también funcionará si cambia ArticleType en el modelo de vista a un SelectListItem, aunque tiene que implementar un convertidor de tipo según el blog de Kazi y registrarlo para forzar al vinculador a tratar esto como un tipo simple.
En su controlador tenemos entonces ...
fuente
El problema es que los buzones no funcionan igual que los cuadros de lista, al menos de la forma que espera el diseño de ASP.NET MVC2: un cuadro desplegable solo permite cero o un valor, ya que los cuadros de lista pueden tener una selección de valores múltiples. Entonces, siendo estricto con HTML, ese valor no debería estar en la lista de opciones como bandera "seleccionada", sino en la entrada misma.
Vea el siguiente ejemplo:
El combo tiene la opción seleccionada, pero también tiene establecido su atributo de valor . Por lo tanto, si desea que ASP.NET MVC2 represente un cuadro desplegable y también tenga un valor específico seleccionado (es decir, valores predeterminados, etc.), debe darle un valor en la representación, como este:
fuente
En ASP.NET MVC 3, simplemente puede agregar su lista a ViewData ...
... y luego hacer referencia a él por su nombre en la vista de la maquinilla de afeitar ...
No tiene que "usar" manualmente la lista en la llamada DropDownList. Al hacerlo de esta manera, también establecí correctamente el valor seleccionado para mí.
Descargo de responsabilidad:
fuente
Logré obtener el resultado deseado, pero con un enfoque ligeramente diferente. En la lista desplegable utilicé el modelo y luego lo hice referencia. No estoy seguro de si esto era lo que buscaba.
Model.Matters.FeeStructures en arriba es mi identificación, que podría ser su valor del artículo que debe seleccionarse.
fuente