DropDownListPara no seleccionar valor

83

Estoy usando el método auxiliar DropDownListFor dentro de una página de edición y no tengo suerte para seleccionar el valor que especifico. Noté una pregunta similar en Stackoverflow. La solución alternativa sugerida fue "rellenar su SelectList en el código de vista". El problema es que ya probé esto y todavía no funciona.

<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>

He establecido un punto de interrupción y he verificado la existencia (y validez) del modelo.AddressStateAbbr. No estoy seguro de lo que me estoy perdiendo.

senfo
fuente

Respuestas:

182

Después de investigar durante una hora, encontré el problema que está causando que el seleccionado no se configure DropDownListFor. La razón es que está usando el nombre de ViewBag igual que la propiedad del modelo.

Ejemplo

public  class employee_insignia
{ 
   public int id{get;set;}
   public string name{get;set;}
   public int insignia{get;set;}//This property will store insignia id
}

// If your ViewBag's name same as your property name 
  ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

Ver

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")

La opción seleccionada no se establecerá en la lista desplegable, PERO cuando cambie el nombre de ViewBag a un nombre diferente, la opción seleccionada se mostrará correcta.

Ejemplo

ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

Ver

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")
wut-excel
fuente
34
¡Esta es realmente una respuesta correcta! Para todos los que busquen en Google, asegúrese de no nombrar la propiedad ViewBag del mismo modo que la propiedad del modelo. No esperaba que esto importara en absoluto, pero en realidad lo solucionó. Estoy en shock.
Tesserex
10
Tengo el mismo problema, aunque la propiedad ViewBag tiene un nombre diferente al de la propiedad modelo:@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Paul Taylor
8
¿Alguien sabe la razón por la que no pueden ser iguales? Esta respuesta salvó mi computadora portátil de ser destrozada :)
Jeandre Pentz
7
No entiendo. También tengo este problema y no estamos usando ViewBag. Además, la pregunta no estaba usando ViewBag
George Mauer
3
¡Considero que esto es un error de ASP.NET MVC!
Néstor Sánchez A.
30

Tratar:

<%= Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")%>

o en la sintaxis de Razor:

@Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")

Los ayudantes basados ​​en expresiones no parecen respetar la propiedad Selected de SelectListItems en su SelectList.

Bn Wasteland
fuente
¡Gracias! ¡Necesitaba una forma rápida de obtener el valor seleccionado de mi repositorio de base de datos! Model.AddressStateAbbr era la pieza que necesitaba. Dulce. Gracias de nuevo
Tom Stickel
30

Si lo está haciendo correctamente y está utilizando un modelo, a diferencia de todos estos bichos raros de ViewBag, y sigue viendo el problema, es porque @Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)no puede coincidir MyValuecon las opciones que tiene MyOptions. Las dos posibles razones para ello son:

  1. MyValuees nulo. No lo ha configurado en su ViewModel. Hacer uno de MyOptionstener un Selected=trueno va a resolver esto.
  2. Más sutilmente, el tipo de MyValuees diferente a los tipos de MyOptions. Entonces, si lo MyValuees (int) 1, pero MyOptionses una lista de cadenas acolchadas {"01", "02", "03", ...}, obviamente no va a seleccionar nada.
Chad Hedgcock
fuente
4
Muchas gracias por esta respuesta. Tampoco entiendo por qué todos usan ViewBag en lugar de crear un modelo de vista adecuado. Esta respuesta me estaba mirando a la cara y te agradezco que conectes los puntos.
Ambigüedades
2
# 2 aquí está mi problema. Tengo una propiedad de modelo que es un tipo de delegado con una carpeta de modelo personalizada para tomar el nombre del método y, de hecho, vincular ese método de una lista de llamadas de método predefinidas que coinciden con la firma del delegado. ¿Alguien ha encontrado una forma de trabajar alrededor del n. ° 2 y hacer que se seleccione correctamente sin un script lateral de clientes hacky?
mikeschuld
1
Gracias de otro hipster que usa View Models: D
Vladimir Bozic
1
Además, para cualquier persona que tiene un SelectList con un atributo de valor diferente que el texto de la pantalla entre las etiquetas de opción por ejemplo: <option value="2">some text</option>. En realidad, parece estar intentando hacer coincidir la propiedad del modelo de vista con el texto de visualización y no con el atributo de valor para elegir la opción seleccionada. Esto me tuvo por un tiempo.
Jason Hanson
17

Si bien no aborda esta pregunta, puede ayudar a los futuros usuarios de Google si siguieron mi ruta de pensamiento:

Quería una selección múltiple y este truco de atributo en DropDownListFor no se seleccionaba automáticamente

Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })

en su lugar, debería haber estado usando ListBoxFor que hizo que todo funcionara

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)
fíat
fuente
6
Seguí tu camino de pensamiento. Mundo: si estás usando DropDownListFor y varios, querías usar ListBoxFor.
Scott Stafford
Es molesto que funcione. En otro lugar de mi código, con todo igual, DropDownListFor funciona bien. Pasé cuatro o cinco horas jugando con esto para intentar que funcionara. Mi última zanja fue esta y funcionó.
Bryan Hobbs
1

También tengo un problema similar y lo resuelvo de la siguiente manera, configure el

Model.States propiedad en su controlador a lo que necesita para ser seleccionado

model.States = "California"

y luego obtendrá "California" como valor predeterminado.

Prageeth godage
fuente
0

este problema es común. cambie el nombre de la propiedad de viewbag a otro nombre de variable de modelo usado en la página.

Seliya Hilal
fuente
0

Otra cosa que debe verificar si no es todo su propio código, es asegurarse de que no haya una función javascript que cambie el valor en la carga de la página. Después de horas de golpearme la cabeza contra una pared leyendo todas estas soluciones, descubrí que esto es lo que me estaba sucediendo.

BMills
fuente
0

Encontré este problema recientemente. Me volvió loco durante aproximadamente una hora. En mi caso, no estaba usando una ViewBagvariable con el mismo nombre que la propiedad del modelo.

Después de rastrear los cambios de control de fuente, el problema resultó ser que mi acción tenía un argumento con el mismo nombre que la propiedad del modelo:

public ActionResult SomeAction(string someName)
{
    var model = new SomeModel();
    model.SomeNames = GetSomeList();
    //Notice how the model property name matches the action name
    model.someName = someName; 
}

En la vista:

@Html.DropDownListFor(model => model.someName, Model.SomeNames)

Simplemente cambié el argumento de la acción a otro nombre y comenzó a funcionar nuevamente:

public ActionResult SomeAction(string someOtherName)
{
    //....
}

Supongo que también se podría cambiar el nombre de propiedad del modelo, pero en mi caso, el nombre del argumento no tiene sentido, así que ...

Con suerte, esta respuesta le ahorrará el problema a otra persona.

JuanR
fuente
0

El problema, al menos para mí, estaba relacionado con el IEnumerable<T>.

Básicamente, lo que sucedió fue que la vista y el modelo no tenían la misma referencia para la misma propiedad.

Si haces esto

IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}

Luego enlaza esto usando el

@Html.DropDownListFor(model => model.Id, Model.CoolNames)

La Vista pierde el rastro de la propiedad CoolNames, una solución simple es simplemente agregar .ToList()Después de hacer una proyección ( .Select());).

jNi
fuente
0

Yo tuve el mismo problema. En el siguiente ejemplo, la variable ViewData ["DATA_ACREDITO_MODELO_INTEGRADO"] tiene una lista SelectListItem con un valor seleccionado predeterminado, pero dicho atributo no se refleja visualmente.

// data 
        var p_estadoAcreditacion = "NO";
        var estadoAcreditacion = new List<SelectListItem>();
        estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)"    , Value = " "    });
        estadoAcreditacion.Add(new SelectListItem { Text = "SI"              , Value = "SI"   });
        estadoAcreditacion.Add(new SelectListItem { Text = "NO"              , Value = "NO"   });

        if (!string.IsNullOrEmpty(p_estadoAcreditacion))
        {
            estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

Lo resolví haciendo el primer argumento de DropdownList, diferente al atributo id.

// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"

...

Pablo Alejandro Pérez Acosta
fuente
0

Sé que esta es una pregunta antigua, pero he tenido el mismo problema en 2020.

Resulta que el problema era que la propiedad del modelo se llamaba "Título", le cambié el nombre a "GivenTitle" y ahora funciona como se esperaba.

Desde

Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })

a

Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
Simón
fuente