asp.net-mvc asp.net-mvc-3 html.dropdownlistfor

asp.net mvc - MVC DropDownList SelectedValue no se muestra correctamente



asp.net-mvc asp.net-mvc-3 (5)

Intenté buscar y no encontré nada que solucionara mi problema. Tengo una DropDownList en una vista de Razor que no mostrará el elemento que he marcado como Seleccionado en la Lista de selección. Aquí está el código del controlador que llena la lista:

var statuses = new SelectList(db.OrderStatuses, "ID", "Name", order.Status.ID.ToString()); ViewBag.Statuses = statuses; return View(vm);

Aquí está el código de vista:

<div class="display-label"> Order Status</div> <div class="editor-field"> @Html.DropDownListFor(model => model.StatusID, (SelectList)ViewBag.Statuses) @Html.ValidationMessageFor(model => model.StatusID) </div>

Lo recorro e incluso en la vista tiene el valor de selección correcto, sin embargo, el DDL siempre muestra el primer elemento de la lista, independientemente del valor seleccionado. ¿Alguien puede señalar lo que estoy haciendo mal para que el DDL se establezca de manera predeterminada en SelectValue?


Asegúrese de que su valor de selección de retorno sea una cadena y no, e int cuando lo declare en su modelo.

Ejemplo:

public class MyModel { public string StatusID { get; set; } }


Crea un modelo de vista para cada vista. Haciéndolo de esta manera solo incluirás lo que se necesita en la pantalla. Como no sé dónde está utilizando este código, supongamos que tiene una vista Crear para agregar un nuevo pedido.

Cree un nuevo modelo de vista para su vista Crear:

public class OrderCreateViewModel { // Include other properties if needed, these are just for demo purposes // This is the unique identifier of your order status, // i.e. foreign key in your order table public int OrderStatusId { get; set; } // This is a list of all your order statuses populated from your order status table public IEnumerable<OrderStatus> OrderStatuses { get; set; } }

Clase de estado del pedido:

public class OrderStatus { public int Id { get; set; } public string Name { get; set; } }

En su vista Crear tendría lo siguiente:

@model MyProject.ViewModels.OrderCreateViewModel @using (Html.BeginForm()) { <table> <tr> <td><b>Order Status:</b></td> <td> @Html.DropDownListFor(x => x.OrderStatusId, new SelectList(Model.OrderStatuses, "Id", "Name", Model.OrderStatusId), "-- Select --" ) @Html.ValidationMessageFor(x => x.OrderStatusId) </td> </tr> </table> <!-- Add other HTML controls if required and your submit button --> }

Sus métodos de acción Crear:

public ActionResult Create() { OrderCreateViewModel viewModel = new OrderCreateViewModel { // Here you do database call to populate your dropdown OrderStatuses = orderStatusService.GetAllOrderStatuses() }; return View(viewModel); } [HttpPost] public ActionResult Create(OrderCreateViewModel viewModel) { // Check that viewModel is not null if (!ModelState.IsValid) { viewModel.OrderStatuses = orderStatusService.GetAllOrderStatuses(); return View(viewModel); } // Mapping // Insert order into database // Return the view where you need to be }

Esto persistirá en sus selecciones cuando haga clic en el botón Enviar y se redireccione de nuevo a la vista Crear para el manejo de errores.

Espero que esto ayude.


El último argumento del constructor SelectList (en el que espera poder pasar la identificación del valor seleccionado) se ignora porque el ayudante DropDownListFor usa la expresión lambda que pasó como primer argumento y usa el valor de la propiedad específica.

Así que aquí está la manera fea de hacer eso:

Modelo:

public class MyModel { public int StatusID { get; set; } }

Controlador:

public class HomeController : Controller { public ActionResult Index() { // TODO: obviously this comes from your DB, // but I hate showing code on SO that people are // not able to compile and play with because it has // gazzilion of external dependencies var statuses = new SelectList( new[] { new { ID = 1, Name = "status 1" }, new { ID = 2, Name = "status 2" }, new { ID = 3, Name = "status 3" }, new { ID = 4, Name = "status 4" }, }, "ID", "Name" ); ViewBag.Statuses = statuses; var model = new MyModel(); model.StatusID = 3; // preselect the element with ID=3 in the list return View(model); } }

Ver:

@model MyModel ... @Html.DropDownListFor(model => model.StatusID, (SelectList)ViewBag.Statuses)

y aquí está la forma correcta, usando el modelo de vista real:

Modelo

public class MyModel { public int StatusID { get; set; } public IEnumerable<SelectListItem> Statuses { get; set; } }

Controlador:

public class HomeController : Controller { public ActionResult Index() { // TODO: obviously this comes from your DB, // but I hate showing code on SO that people are // not able to compile and play with because it has // gazzilion of external dependencies var statuses = new SelectList( new[] { new { ID = 1, Name = "status 1" }, new { ID = 2, Name = "status 2" }, new { ID = 3, Name = "status 3" }, new { ID = 4, Name = "status 4" }, }, "ID", "Name" ); var model = new MyModel(); model.Statuses = statuses; model.StatusID = 3; // preselect the element with ID=3 in the list return View(model); } }

Ver:

@model MyModel ... @Html.DropDownListFor(model => model.StatusID, Model.Statuses)


Para mí, el problema fue causado por los grandes números de relleno css (relleno superior e inferior dentro del campo desplegable). Básicamente, el elemento se mostraba pero no era visible porque estaba muy abajo. Lo arregle haciendo mi número de relleno más pequeño.


Por favor encuentre el código de muestra a continuación.

public class Temp { public int id { get; set; } public string valueString { get; set; } }

Controlador

public ActionResult Index() { // Assuming here that you have written a method which will return the list of Temp objects. List<Temp> temps = GetList(); var tempData = new SelectList(temps, "id", "valueString",3); ViewBag.Statuses = tempData; return View(); }

Ver

@Html.DropDownListFor(model => model.id, (SelectList)ViewBag.Statuses) @Html.ValidationMessageFor(model => model.id)