htmlattributes - ASP.NET MVC-Html.DropDownList-Valor no establecido mediante ViewData.Model
html textbox asp net (7)
Acabo de comenzar a jugar con ASP.NET MVC y me he tropezado con la siguiente situación. Se parece mucho a un error, pero si no es así, se agradecería una explicación :)
La vista contiene cosas bastante básicas
<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%>
<%=Html.TextBox("MyTextBox")%>
Cuando no se usa un modelo, el valor y el elemento seleccionado se configuran como se espera:
//works fine
public ActionResult MyAction(){
ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}
ViewData["MyList"] = "XXX"; //set the selected item to be the one with value ''XXX''
ViewData["MyTextBox"] = "ABC"; //sets textbox value to ''ABC''
return View();
}
Pero cuando intenta cargar a través de un modelo, el cuadro de texto tiene el valor establecido como se esperaba, pero el menú desplegable no obtiene un conjunto de elementos seleccionado.
//doesnt work
public ActionResult MyAction(){
ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}
var model = new {
MyList = "XXX", //set the selected item to be the one with value ''XXX''
MyTextBox = "ABC" //sets textbox value to ''ABC''
}
return View(model);
}
¿Algunas ideas? Mi opinión actual es que, tal vez cuando se utiliza un modelo, estamos limitados a establecer el elemento seleccionado en el constructor SelectList en lugar de usar viewdata (que funciona bien) y pasar la lista de selección con el modelo, lo que tendría el beneficio de limpiar un poco el código - Me pregunto por qué este método no funciona ...
Muchas gracias por las sugerencias
Mi preocupación con esto es que solo puedes usar la lista para un campo. Tengo entidades con múltiples campos de usuario, así que uso lo siguiente:
< %= Html.DropDownList("fieldAAA",
new SelectList( (IEnumerable) ViewData["Users"], "Value", "Text", fieldAAA))
%>
intente configurar el valor seleccionado en la acción del controlador al crear la colección SelectList.
ViewData ["AddressTypeId"] = new SelectList (CustomerService.AddressType_List (), "AddressTypeId", "Name", myItem.AddressTypeId );
Cuando tenga problemas con ViewData inválido o nulo, preste atención a la acción de su controlador.
Supongamos que tiene un ViewData llamado MyList para Html.DropDownlist llamado MyList.
Si llama a ModelState.AddModelError("MyList","Please select the profession")
, reemplazará su contenido de la lista ViewData con este texto de advertencia.
Esa es también la razón por la cual las personas en Internet tienen problemas nulos con ViewData en DropDownList.
La conclusión es, preste atención a sus identificaciones en el modelo de error, no deben interferir con sus controles html.
Obviamente estoy tarde aquí. Pero quería agregar este comentario en caso de que alguien encontrara este problema.
En MVC 2. Puede hacer lo siguiente para seleccionar el elemento ...
public ActionResult Edit(int id)
{
Team team = _db.TeamSet.First(m => m.TeamID == id);
var fanYear = from c in _db.FanYearSet select c;
ViewData["FantasyYear"] = new SelectList(fanYear, "YearID", "FantasyYear", team.FanYearReference.EntityKey.EntityKeyValues[0].Value);
var league = from c in _db.LeagueSet select c;
ViewData["League"] = new SelectList(league, "LeagueID", "League_Name", team.LeaguesReference.EntityKey.EntityKeyValues[0].Value);
return View(team);
}
El cuarto parámetro toma un valor y seleccionará el valor que desee en la lista desplegable. En mi ejemplo, tengo una tabla llamada equipo y es que tengo una relación establecida en una tabla llamada fanYear y league.
Puedes ver que primero obtengo el equipo que estoy editando, luego construyo una lista desplegable del año de fantasía y otra para ligas. Para determinar el año y la liga del equipo, tuve que usar la Referencia de la entidad.
Sólo quería ponerlo allí fuera. No pude encontrar ningún ejemplo de hacer esto.
Ok, me puede estar faltando algo de este hilo; sin embargo, en C #, lo siguiente funciona:
Html.DropDownList("ProfessionGuid", (SelectList)ViewData["Professions"])
Donde '' ProfessionGuid
'' es el valor que se seleccionará en la lista.
En VB.Net creo que sería:
Html.DropDownList("ProfessionGuid", ViewData["Professions"] AS SelectList)
En realidad, solo debe pasar null
para Html.DropDownList()
.
Estaba teniendo el mismo problema exacto, y usé el reflector para mirar el código fuente de MVC.
En el método SelectInternal()
la clase System.Web.Mvc.Extensions.SelectExtensions
, comprueba si el parámetro selectList es nulo o no. Si se pasa como null
, busca la lista de SelectList
correctamente.
Aquí está el "Código detrás".
ViewData["MyDropDown"] = new SelectList(selectListItems,
"Value",
"Text",
selectedValue.ToString()
);
Aquí está el código de vista HTML.
<%= Html.DropDownList("MyDropDown", null,
"** Please Select **",
new { @class = "my-select-css-class" }
) %>
Nota: Estoy usando ASP.NET MVC 2.0 (versión Beta).
NOTA ACTUALIZADA: 31 de enero de 2012
Después de usar extensivamente ASP.NET MVC durante los últimos 3 años, prefiero utilizar Html.EditorFor()
additionalViewData
del método Html.EditorFor()
más.
Pase sus [Elementos de la lista] como un objeto anonymous
con el mismo nombre de propiedad que la propiedad del Modelo en el método Html.EditorFor()
.
<%= Html.EditorFor(
m => m.MyPropertyName,
new { MyPropertyName = Model.ListItemsForMyPropertyName }
) %>
Si desea más detalles, consulte mi respuesta aquí en otro hilo .
Después de un montón de dobladillos y zarcillos, se reduce a la siguiente línea de código
if (ViewData.ModelState.TryGetValue(key, out modelState))
lo que significa que MVC está intentando resolver el valor solo mirando el objeto ViewData Dictionary <> y no atravesando el objeto ViewData.Model.
Si eso es un error, una limitación o una decisión de diseño, no estoy seguro. Sin embargo, puede solucionarlo de la siguiente manera:
<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>