MVC DropDownList SelectedValue no se muestra correctamente

Intenté buscar y no encontré nada que solucionara mi problema. Tengo una DropDownList en una vista 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 puebla 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 la vista:

 
Order Status
@Html.DropDownListFor(model => model.StatusID, (SelectList)ViewBag.Statuses) @Html.ValidationMessageFor(model => model.StatusID)

Lo recorro e incluso en la vista tiene el SelectedValue 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 DDL se convierta por defecto en SelectValue?

El último argumento del constructor SelectList (en el que espera poder pasar el ID del valor seleccionado) se ignora porque el asistente DropDownListFor usa la expresión lambda que pasó como primer argumento y utiliza 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 esta es la forma correcta, usando el modelo de vista real:

Modelo

 public class MyModel { public int StatusID { get; set; } public IEnumerable 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) 

Crea un modelo de vista para cada vista. Haciéndolo de esta manera, solo incluirá lo que se necesita en la pantalla. Como no sé dónde está utilizando este código, supongamos que tiene una vista de 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, // ie 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 OrderStatuses { get; set; } } 

Clase de estado de orden:

 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()) { 
Order Status: @Html.DropDownListFor(x => x.OrderStatusId, new SelectList(Model.OrderStatuses, "Id", "Name", Model.OrderStatusId), "-- Select --" ) @Html.ValidationMessageFor(x => x.OrderStatusId)
}

Tus 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 mantendrá sus selecciones cuando haga clic en el botón Enviar y se redirige a la vista de creación para el manejo de errores.

Espero que esto ayude.

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

Ejemplo:

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

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 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)