Mi modelo es el siguiente:en el poste, una lista desplegable SelectList.SelectedValue es nulo
public class testCreateModel
{
public string s1 { get; set; }
public SelectList DL { get; set; }
public testCreateModel()
{
Dictionary<string, string> items = new Dictionary<string, string>();
items.Add("1", "Item 1");
items.Add("2", "Item 2");
DL = new SelectList(items, "Key", "Value");
}
}
Mi iniciación de las acciones es:
public ActionResult testCreate()
{
testCreateModel model = new testCreateModel();
return View(model);
}
Mi punto de vista Razor (partes irrelevantes borrados) es:
@model Tasks.Models.testCreateModel
@using (Html.BeginForm()) {
<fieldset>
<legend>testCreateModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.s1)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.s1)
</div>
<div class="editor-label">
Select an item:
</div>
<div class="editor-field">
@Html.DropDownList("dropdownlist", (SelectList)Model.DL)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
La acción posterior a la espalda es:
public ActionResult testCreate(testCreateModel model, FormCollection collection)
{
if (ModelState.IsValid)
{
Console.WriteLine("SelectedValue: ",model.DL.SelectedValue);
Console.WriteLine("FormCollection:", collection["dropdownlist"]);
// update database here...
}
return View(model);
}
En segundo palo, model.DL.SelectedValue es nulo. (Sin embargo, el elemento seleccionado se puede obtener de FormCollection, pero eso es además del punto). El objeto DL está siendo adecuadamente poblada de lo contrario, la salida inmediata de la ventana de la siguiente manera:
model.DL
{System.Web.Mvc.SelectList}
base {System.Web.Mvc.MultiSelectList}: {System.Web.Mvc.SelectList}
SelectedValue: null
model.DL.Items
Count = 2
[0]: {[1, Item 1]}
[1]: {[2, Item 2]}
model.DL.SelectedValue
null
P1: ¿Cómo se puede hacer uso de la propiedad SelectedValue en su lugar?
Ahora, si en la vista de la maquinilla de afeitar cambio el nombre de la etiqueta HTML SELECT para DL (es decir, mismo que el nombre de la propiedad en el modelo):
@Html.DropDownList("DL", (SelectList)Model.DL)
consigo una excepción:
No parameterless constructor defined for this object.
Stack Trace:
[MissingMethodException: No parameterless constructor defined for this object.]
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +199
System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext controllerContext, ModelBindingContext bindingContext, ValueProviderResult
...
Q2: ¿Por qué?
Gracias.
Gracias por el método sugerido para usar una lista desplegable. ¡Funciona y se necesita menos trabajo para recoger el valor seleccionado! –
Gracias, esta es la mejor publicación que me heionado con respecto al uso de la lista desplegable en mvc –