Creo una selectList en mi controlador, para mostrar en la vista.
Estoy tratando de crearlo sobre la marcha, algo así ... así ...
myViewData.PageOptionsDropDown =
new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15");
Se compila, pero el resultado es malo ...
<select id="PageOptionsDropDown" name="PageOptionsDropDown">
<option>10</option>
<option>15</option>
<option>25</option>
<option>50</option>
<option>100</option>
<option>1000</option>
</select>
¿Observa cómo no se selecciona ningún elemento?
¿¿Cómo puedo arreglar esto??
c#
asp.net-mvc
selectlist
Pure.Krome
fuente
fuente
Respuestas:
Así es como lo hago
A segunda vista, no estoy seguro de saber lo que buscas ...
fuente
SelectList sList = new SelectList(selectList, "Text", "Value", selected);
dondeselected
está la corriente seleccionados por el clienteYo uso un método de extensión:
uso
con
fuente
Usando el constructor que acepta
items, dataValueField, dataTextField, selectedValue
como parámetros:Entonces en tu opinión:
fuente
Partiendo de la respuesta de Thomas Stock, creé estos
ToSelectList
métodos sobrecargados :En su controlador, puede hacer lo siguiente:
Y finalmente en su Vista, ponga:
"(Select one)"
Producirá el resultado deseado; por supuesto, puede omitir la opción LabelLabel anterior si no desea el primer elemento vacío:Actualización: Una lista de código revisada se puede encontrar aquí con comentarios XML.
fuente
El problema es que SelectList funciona según lo diseñado. El error está en el diseño. Puede establecer la Propiedad seleccionada en SelectedItem, pero esto se ignorará por completo si recorre la lista con GetEnumerator () (o si Mvc lo hace por usted). Mvc creará nuevos SelectListItems en su lugar.
Debe usar el ctor SelectList con SelectListItem [], Text-Name, Value-Name y SelectedValue. ¡Tenga en cuenta pasar como SelectedValue el VALOR de SelectListItem, que desea seleccionar, no el SelectListItem en sí! Ejemplo:
(No probé esto, pero tuve el mismo problema)
entonces la segunda opción obtendrá el atributo selected = "selected". Eso parece buenos DataSets viejos ;-)
fuente
Esta es una opción:
fuente
Si eso es literalmente todo lo que quiere hacer, simplemente declarar la matriz como cadena corrige el problema del elemento seleccionado:
fuente
Es muy simple hacer que SelectList y SelectedValue trabajen juntos, incluso si su propiedad no es un objeto simple como Int, String o Double value.
Ejemplo:
Asumiendo que nuestro objeto Región es algo como esto:
Y su modelo de vista es algo así como:
Puedes tener el siguiente código:
Solo si anula el método ToString del objeto Región a algo como:
Esto tiene 100% de garantía para trabajar.
Pero realmente creo que la mejor manera de hacer que SelectList funcione al 100% en todas las circunstancias es usar el método Equals para probar el valor de la propiedad DropDownList o ListBox en cada elemento de la colección de elementos.
fuente
Parece que si tiene una vista fuertemente tipada necesita cambiar la ID del menú desplegable para que NO sea el nombre de una propiedad en la clase heredada. Luego debe poner algo de lógica en su método de edición (POST) para obtener el valor seleccionado de FORMCollection y ponerlo en su instancia antes de confirmar sus cambios.
Esto es ciertamente un poco extraño, pero lo probé y funciona.
Entonces, si su clase tiene un campo llamado CountryId, y está mostrando una lista de nombres de países, haga que el menú desplegable tenga una identificación de CountryName en lugar de CountryId, luego en la publicación, puede hacer algo con Collection ["CountryName"] .
fuente
Tuve exactamente el mismo problema. La solución es simple. Simplemente cambie el parámetro "nombre" pasado al asistente de DropDownList a algo que no coincida con ninguna de las propiedades existentes en su ViewModel. Lea más aquí: http://www.dotnetguy.co.uk/post/2009/06/25/net-mvc-selectlists-selected-value-does-not-get-set-in-the-view
Cito al Dan Watson:
¡salud!
fuente
Todas estas respuestas se ven geniales, pero parece ser que el controlador está preparando datos para una Vista en un formato estructurado conocido en lugar de permitir que la vista simplemente repita un IEnumerable <> entregado a través del modelo y cree una lista de selección estándar y luego permita que DefaultModelBinder entregarle el artículo seleccionado a través de un parámetro de acción. Si, no, porque no? Separación de preocupaciones, ¿sí? Parece extraño tener el controlador para construir algo tan específico para la interfaz de usuario y la vista.
fuente
Sencillo:
fuente
Simplemente lo ejecuté así y no tuve problemas,
y
También funcionó si haces esto,
y
fuente
Usando su ejemplo, esto funcionó para mí:
controlador:
ver:
fuente
fuente
Lo hago así:
ToArray () se encarga de los problemas.
fuente
Si desea pasar un texto aleatorio a su DropDownList, por ejemplo --Seleccionar-- , puede hacerlo fácilmente con este código:
fuente
Puede darse el caso de que tenga cierta ambigüedad en su ViewData:
Echa un vistazo aquí
fuente
el valor seleccionado en el modelo aprovecha en lugar del elemento predeterminado. (Estoy de acuerdo en que no leí todas las publicaciones)
fuente
No recuerdo cómo se configuró mvc 1, pero parece que también quería que la lista de selección tuviera el mismo nombre que el campo al que pertenecía ...
Lo que encontré, como alguien dijo anteriormente, es que mis listas de selección no funcionaban en mvc2 cuando ViewData se enviaron como se llamaba igual que el campo.
Por ejemplo:
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForName"]) %>
funciona cuando
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForID"]) %>
no funciona ya que el nombre de ViewData "ForID" se llama igual que el campo para el que está trabajando
fuente
Una posible explicación es que el valor de la lista de selección al que está vinculando no es una cadena.
Entonces, en ese ejemplo, ¿el parámetro 'PageOptionsDropDown' es una cadena en su modelo? Porque si no es así, el valor seleccionado en la lista no se mostrará.
fuente
Si busca en el código fuente MVC 2 en el método de extensión Html.DropDownList, nunca verifica la propiedad SelectValue de la clase SelectList. Solo intentará coincidir contra su Modelo.
Todo lo anterior son variaciones de un tema, es decir, ¿cómo se envían un montón de datos a la vista para obtener una lista desplegable y todos son tan buenos entre sí (más o menos).
El problema está en la vista. Cree su propio método de extensión DropDownList que respete el valor de selección que establezca o repita a mano. Lo que funcione mejor para ti.
fuente
Si tiene una colección en su modelo y su Vista es de tipo fuerte, alguna variación de esto funcionará:
-o-
fuente