Cree DropDownListFor desde SelectList con el valor predeterminado

Tengo una dropdownlistfor :

  @Html.DropDownListFor(model => model.Item.Item.Status, new SelectList(@Model.AllStatus, "id", "Description"), new { id = "statusDropdown" }) @Html.ValidationMessageFor(model => model.Item.Item.Status) 

Salida HTML:

  Completed by Admin General Error New  

¿Cómo puedo actualizar este código para establecer una opción seleccionada por defecto? P.EJ

New

Lo intenté:

  @Html.DropDownListFor(model => model.Item.Item.Status, new SelectList(@Model.AllStatus, "id", "Description",@Model.SelectedStatusIndex), new { id = "statusDropdown" }) 

@Model.SelectedStatusIndex tiene un valor de 4, pero no cambia la opción predeterminada a Nuevo.

También intenté:

 @Html.DropDownListFor(model => model.SelectedStatusIndex, new SelectList(@Model.AllStatus, "id", "Description"), new { id = "statusDropdown" }) @Html.ValidationMessageFor(model => model.Item.Item.Status) 

Esto selecciona la opción predeterminada “Nuevo”, pero model.Item.Item.Status no se establece mediante el menú desplegable en HTTP POST.

Otro detalle:

model.Item.Item.Status es un int. @Model.AllStatus es una tabla SQL que enumera todas las opciones de estado disponibles.

Ya existen algunas discusiones sobre eso aquí o allá . Uno de los problemas podría estar usando un tipo diferente a la string para el valor clave. En el pasado tuve problemas similares y sé que lo resolví de esta manera : establecí explícitamente la propiedad Selected al preparar la lista (en su caso, AlLStatus ).

Significaría, para su caso (en la acción del controlador):

 IEnumerable selectList = from s in allStatus // where ever you get this from, database etc. select new SelectListItem { Selected = (s.id == model.Item.Item.Status), Text = cs.Description, Value = s.id.ToString() }; model.AllStatus = selectList; 

Esto es además de las respuestas anteriores. Así es como lo habría hecho.

El modelo de vista está ahí para representar sus datos. Por lo tanto, para una sola lista desplegable tendría lo siguiente:

 public class MyViewModel { public int StatusId { get; set; } public IEnumerable Statuses { get; set; } } 

Y la clase de estado se vería así:

 public class Status { public int Id { get; set; } public string Description { get; set; } } 

El método de acción del controlador para manejar la vista:

 public class MyController { private readonly IStatusService statusService; public MyController(IStatusService statusService) { this.statusService = statusService; } public ActionResult MyActionMethod() { MyViewModel viewModel = new MyViewModel { Statuses = statusService.GetAll(), StatusId = 4 // Set the default value }; return View(viewModel); } } 

La vista se verá así:

 @model MyProject.ViewModels.MyViewModel @Html.DropDownListFor( x => x.StatusId, new SelectList(Model.Statuses, "Id", "Description", Model.StatusId), "-- Select --" ) @Html.ValidationMessageFor(x => x.StatusId) 

Hay que ir

Terminé usando una variante de la respuesta de thomasjaworski.

Ver:

 @Html.DropDownListFor(model => model.SelectedStatusIndex, new SelectList(@Model.StatusSelectList, "Value", "Text"), new { id = "statusDropdown" }) 

ViewModel constructor

  StatusSelectList = AllStatus.Select(x => new StatusSelectListItem { Text = x.Description, Value = x.id.ToString() }).ToList(); this.SelectedStatusIndex = 2;//Default Status is New 

Controlador en HTTP POST

Configuré model.Item.Item.Status separado desde el menú desplegable:

 model.Item.Item.Status = model.SelectedStatusIndex; 

porque el conjunto desplegable es el valor de la expresión pasada como primer argumento:

 @Html.DropDownListFor(model => model.SelectedStatusIndex, new SelectList(@Model.StatusSelectList, "Value", "Text"), new { id = "statusDropdown" }) 

En este caso, model.SelectedStatusIndex es lo que establece el menú desplegable. Esta implementación del controlador es lo que encontré complicado.

Puede usar “Insertar” para agregar el valor predeterminado de Dropdown y agregarlo a su lista dinámica: de esta manera no necesita usar Razor en su Vista.

 List m = X.GetList(); m.Insert(0, new Y{ Name = "--Select--" });