asp.net-mvc-3 - ejemplos - html dropdownlist mvc 5
El valor seleccionado Html.DropDownList no funciona con ViewBag (5)
Bueno, después de un par de horas leyendo cosas por aquí, intentando sin éxito todas las soluciones, también encontré este artículo que pensé que salvaría mi vida ... nada.
Larga historia corta.
Aquí está mi vista (todas las combinaciones)
@Html.DropDownList("yearDropDown",(IEnumerable<SelectListItem>)ViewBag.yearDropDown)
@Html.DropDownList("yearDropDownxxx",(IEnumerable<SelectListItem>)ViewBag.yearDropDown)
@Html.DropDownList("yearDropDown",(<SelectList>)ViewBag.yearDropDown)
@Html.DropDownList("yearDropDown")
Aquí está mi controlador
public ActionResult(int year)
{
var years = new int[] { 2007, 2008, 2009, 2010, 2011, 2012 }
.Select(x => new SelectListItem {
Text = x.ToString(),
Value = x.ToString(),
Selected=x==year }).Distinct().ToList();
years.Insert(0, new SelectListItem { Value = null, Text = "ALL YEARS" });
ViewBag.yearDropDown = new SelectList(years, "Value", "Text", years.Where(x => x.Selected).FirstOrDefault());
return View();
}
Aquí está mi HTML renderizado. Seleccionado en ninguna parte.
<select id="yearDropDown" name="yearDropDown"><option value="">ALL YEARS</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010">2010</option>
<option value="2011">2011</option>
<option value="2012">2012</option>
</select>
No hace falta mencionar, pero lo haré, lo compré en mi reloj y SelectList en realidad tiene la propiedad SelectedValue poblada con el año seleccionado pasado al controlador. Pero cuando renderizo en la vista, va a la primera opción.
Por favor, necesito la solución para DropDownList
, NO para DropDownListFor
. Estoy resaltando esto porque vi a otras personas aquí pidiendo la misma ayuda y muchas personas les dieron instrucciones, y casi las ordenaron, para usar DropDownListFor. Hay una razón por la cual NECESITO usar DropDownList.
SOLUCIÓN: mira mi propia respuesta. Sin embargo, aquí están los cambios simples que hice.
Controlador:
ViewBag.yearDropDown = years;
Ver:
@Html.DropDownList("yearDropDown")
Cambie el nombre de la propiedad ViewBag para NO coincidir con el nombre de DropDownList. Utilice ViewBag.yearDropDownDD
lugar de ViewBag.yearDropDown
.
TAMBIÉN, está creando la Lista de selección de manera incorrecta. Debe pasar el valor seleccionado, no el elemento de la matriz:
ViewBag.yearDropDown = new
SelectList(years, "Value", "Text", years.Where(x => x.Selected).FirstOrDefault().Value);
El primer lugar en el que debería haber ido a aprender ... y no lo hice.
Gracias por tus respuestas. Realmente lo aprecio. Tengo ganas de dispararme a mi propio pie ahora. Dos horas leyendo blogs y tardé 2 minutos en replicar este ejemplo y funcioné perfectamente ...
ViewBag.yearDropDown = new SelectList(years, "Value", "Text", years.Where(x => x.Selected).FirstOrDefault());
El último parámetro aquí es SelectListItem
, pero debe seleccionarse value
(string en su ejemplo)
SelectList Constructor (IEnumerable, String, String, Object)
El problema también puede ser el nombre, mira aquí.
En el controlador
ViewBag.PersonList= new SelectList(db.Person, "Id", "Name", p.PersonId);
En la vista
@Html.DropDownList("PersonList",(SelectList)ViewBag.PersonList )
Esto no funcionará, tienes que cambiar el nombre, así que no es lo mismo.
@Html.DropDownList("PersonList123",(SelectList)ViewBag.PersonList )
Así que cambie yearDropDown y le funcionará.
Saludos cordiales, Christian Lyck.
Sé que es una vieja pregunta, pero compartiré otra solución ya que algunas veces ha hecho algo correctamente, pero no puede ver el valor seleccionado después de una solicitud y respuesta, ya que su afeitadora puede tener errores. En esta condición, que he tenido, puedes usar la opción de seleccionar usando viewbag:
En el controlador que tenía:
ViewBag.MyData = GetAllData(strSelected);
...
y como una función privada en el controlador que tuve:
private List<SelectListItem> GetAllData(List<string> selectedData)
{
return MyGetAll().Select(x =>
new SelectListItem
{
Text = x.Point,
Value = x.Amount.ToString(),
Selected = selectedPrizes.Contains(x.Amount.ToString())
})
.ToList();
}
Y en .cshtml tuve:
<select id="Amount" name="Amount" multiple="multiple">
@foreach (var listItem in (List<SelectListItem>)ViewBag.MyData)
{
<option value="@listItem.Value" @(listItem.Selected ? "selected" : "")>
@listItem .Text
</option>
}
</select>
Espero que sea útil para problemas similares :)