style net mvc ejemplos dropdownlist desplegable bootstrap asp asp.net-mvc razor html.dropdownlistfor selectlist dropdownlistfor

asp.net-mvc - net - menu desplegable razor



¿Cuál es la mejor manera de enlazar @ Html.DropDownListFor en ASP.NET MVC5? (2)

Quiero vincular @Html.DropDownListFor partir de los datos del Model sin usar Viewbag y ver muchos ejemplos diferentes en la web. Pero la mayoría usa Viewbag o un método de extensión y quiero un mejor enfoque para resolver este problema. Probé los siguientes métodos pero parece que no funciona:

@Html.DropDownListFor(m => m.LabId, new SelectList(Model.Lab, "Id", "Name"), "---- Select----", new { @class = "selectpicker" } )

¿Es posible enlazar @Html.DropDownListFor directamente desde el Modelo sin usar Viewbag o algún otro método adicional en el Controller en ASP.NET MVC5 ? ¿Podrías dar algunos ejemplos para realizar esto mejor?


Estás en una buena pista al tener los elementos de la lista en tu modelo. No sé cómo lo has implementado en tu código.

La propiedad Lab en su clase de modelo debe ser un IEnumerable, List o Collection de lo que desea. y luego en su vista de afeitar, se ve bien.

Tal vez lo que está olvidando es inicializar la lista desde el método de acción en el controlador antes de enviarlo a la vista. P.ej:

var model = new ViewModel{ Labs = repository.GetLabs(); }

Más arriba, supongo que el repositorio debe ser algo que tenga acceso o medios para obtener los datos necesarios, y también que la propiedad Labs se define como IEnumerable<Lab> Labs en la clase ViewModel.

Todo debería funcionar Tal vez deberías ser claro en cuanto a qué error estás obteniendo.


El enfoque del modelo de vista fuertemente tipado que no utiliza elementos dinámicos como ViewBag

Puede agregar una nueva propiedad a su modelo de vista para las opciones SELECT de tipo IEnumrable<SelectListItem> .

view model es una clase de POCO simple utilizada para transferir datos entre el método de vista a acción y viceversa. Ellos son específicos a las vistas. Agregue propiedades solo necesarias para la vista.

public class CreateUserVm { public IEnumrable<SelectListItem> Labs { set;get;} public int SelectedLabId { set;get;} //Add other properties as needed for the view }

y en su acción GET, cree un objeto de este modelo de vista, cargue la propiedad Labs y envíela a la vista.

public ActionResult Create() { var vm= new CreateUserVm(); // Hard coded for demo. You can replace with real data from db vm.Labs = new List<SelectListItem> { new SelectListItem { Value="1", Text="One" }, new SelectListItem { Value ="2", Text="Two" } }; return View(vm); }

y en la vista que está fuertemente tipada a este modelo de vista, llame al método DropDownListFor helper

@model CreateUserVm @Html.DropDownListFor(f=>f.SelectedLabId, Model.Labs,"Select one")

Preseleccionando una opción en el menú desplegable

Si desea seleccionar previamente una opción cuando razor representa la página, puede establecer el valor de la propiedad SelectedLabId de su modelo de vista en el value propiedad value del elemento Option (SelectListItem).

public ActionResult Create() { var vm= new CreateUserVm(); // Hard coded for demo. You can replace with real data from db vm.Labs = new List<SelectListItem> { new SelectListItem { Value="1", Text="SugarLab" }, new SelectListItem { Value ="2", Text="CandyLab" }, new SelectListItem { Value ="3", Text="SodaLab" } }; vm.SelectedLabId = 2; // Will set "CandyLab" option as selected return View(vm); }

Si desea utilizar datos reales, en lugar de los 2 elementos codificados, puede hacerlo

vm.Labs = dbContext.Labs.Select(x=>new SelectListItem { Value=x.Id.ToString(), Text= x.Name }).ToList();

Asumiendo que dbContext es su objeto de clase DbContext y tiene una propiedad Labs de tipo DbSet<Lab> donde cada entidad Lab tiene una propiedad Id y Name.