drop-down-menu - selección - lista desplegable condicionada
¿Cómo publicar el valor seleccionado de una lista de selección en el controlador usando un modelo de vista? (2)
Pruebe usar @Html.DropDownListFor
en @Html.DropDownListFor
lugar, si "estado" es parte de su modelo, puede usarlo así:
@Html.DropDownListFor(m => m.Contact.StateId, Model.States, "-- Please select a State --")
donde m.State
contiene el valor seleccionado.
Además, para no confundir IEnumerable con el Modelo, lo pondría en ViewBag / ViewData.
En su lugar, se vería algo como esto:
@Html.DropDownListFor(m => m.Contact.StateId, (IEnumerable<string>)ViewBag.States, "-- Please select a State --")
Y en su acción que devuelve esta vista, deberá inicializar el estado enumerable de la propiedad ViewBag.States.
Esta pregunta se ha formulado de varias formas, pero ninguna de las respuestas parece ajustarse a mi situación. Simplemente estoy tratando de recuperar el valor seleccionado de una lista desplegable en mi controlador.
Aquí está mi código:
ViewModel.cs
public class ViewModel
{
public ViewModel() {}
public ViewModel(Contact contact, IEnumerable<State> states)
{
this.Contact = contact;
this.States = new SelectList(states, "Id", "Name", contact.StateId);
}
public Contact Contact {get;set;}
public SelectList States {get;set;}
}
Controller.cs
[HttpPost]
public ActionResult Edit(ViewModel viewModel)
{
_contactService.UpdateContact(viewModel.Contact);
return RedirectToAction("Item", new {id = viewModel.Contact.Id});
}
View.cshtml
<button type="submit" onclick="javascript:document.update.submit()"><span>Update</span></button>//aesthic usage.
@{using (Html.BeginForm("Edit", "Controller", FormMethod.Post, new { name = "update" }))
{
@Html.HiddenFor(m => m.Contact.Id)
@Html.LabelFor(m => m.Contact.Name, "Name:")
@Html.TextBoxFor(m => m.Contact.Name)
<label for="state">State:</label>
@Html.DropDownList("state", Model.States)
}
}
Todo funciona como se espera, excepto que no se pasan valores de la lista desplegable en mi viewModel publicado al controlador. La página de edición y todos los campos se cargan correctamente. Los menús desplegables se unen correctamente y muestran sus valores seleccionados correctamente. Sin embargo, cuando publico solo obtengo un objeto de "contacto" pasado al controlador. El objeto SelectList "Estados" es nulo.
Intenté mapear una propiedad "StateId" en mi viewModel contstructor pero tampoco funcionó. ¿Qué estoy haciendo mal?
Gracias.
Odio responder mis propias preguntas, pero basándome en los múltiples problemas que he combinado con la gran cantidad de respuestas disponibles, pensé que resumiría mis hallazgos.
En primer lugar, gracias por Filip, su respuesta no solucionó exactamente mi problema pero me condujo en la dirección correcta. +1
Si está creando un formulario para ver y editar que requiere una lista desplegable, aquí hay algunas sugerencias y errores. Empezaré con una lista de parámetros que necesitaba para satisfacer mis necesidades.
- Las vistas fuertemente tipadas en mi opinión son preferibles. Minimiza las cadenas mágicas.
- Los modelos de vista deben contener la menor cantidad de lógica y elementos extraños posible. Solo debería haber trabajo para facilitar una colección de objetos de datos.
- La lista desplegable debe mostrar el valor seleccionado.
- El valor seleccionado debe volver a asignarse fácilmente al modelo de vista en el envío de formulario.
Esto puede sonar como una lista obvia y fácil de obtener, pero para alguien nuevo en MVC, no lo es. Revisaré mi código de arriba con comentarios. Aquí esta lo que hice.
ViewModel.cs
public class ViewModel
{
public ViewModel() {}
public ViewModel(Contact contact, IList<State> states)
{
//no need to pass in a SelectList or IEnumerable, just what your service or repository spits out
this.Contact = contact;
this.States = states;
}
public Contact Contact {get;set;}
public IList<State> States {get;set;}
}
Controller.cs // nada realmente diferente que arriba
public ActionResult Edit(int id)
{
var contact = _contactService.GetContactById(id);
var states = _stateService.GetAllStates();
return View(new ViewModel(contact, states));
}
public ActionResult Edit(ViewModel viewModel)
{
_contactService.UpdateContact(viewModel.Contact);
return RedirectToAction("Edit", new {id = viewModel.Contact.Id });
}
Ver // gracias a Artirto en esta publicación
@{using (Html.BeginForm("Edit", "Controller", FormMethod.Post))
{
@Html.HiddenFor(m => m.Contact.Id)
@Html.DropDownListFor(m => m.Contact.StateId, new SelectList(Model.States, "Id", "Name", @Model.Contact.StateId))
<input type="submit" value="Save" />
}
}