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.