Crie DropDownListFor de SelectList com o valor padrão

Eu tenho uma dropdownlistfor :

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

Saída HTML:

  Completed by Admin General Error New  

Como posso atualizar este código para definir uma opção selecionada padrão? POR EXEMPLO

New

Eu tentei:

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

@Model.SelectedStatusIndex tem um valor de 4, mas não altera a opção padrão para Novo.

Eu também tentei:

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

Isso seleciona a opção padrão “Novo”, mas model.Item.Item.Status não é definido pela lista suspensa no HTTP POST.

Outro detalhe:

model.Item.Item.Status é um int. @Model.AllStatus é uma tabela SQL que lista todas as opções de status disponíveis.

Já existem algumas discussões sobre isso aqui ou ali . Um dos problemas pode estar usando um tipo diferente de string para o valor da chave. Eu tive problemas semelhantes no passado e eu sei que eu resolvi assim – explicitamente definindo a propriedade Selected ao preparar a lista (no seu caso, AlLStatus ).

Significaria, para o seu caso (na ação do 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; 

Isto é, além das respostas acima. É assim que eu teria feito isso.

O modelo de visualização está lá para representar seus dados. Então, para uma única lista suspensa, eu teria o seguinte:

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

E a class Status seria assim:

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

O método de ação do controlador para manipular a exibição:

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

A visão ficará assim:

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

Ai está.

Acabei usando uma variante da resposta de thomasjaworski.

Visão:

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

Construtor ViewModel

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

Controlador no HTTP POST

Eu defino model.Item.Item.Status separadamente da lista suspensa:

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

porque o conjunto suspenso é o valor da expressão passado como o primeiro argumento:

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

Nesse caso, model.SelectedStatusIndex é o definido pela lista suspensa. Essa implementação do controlador é o que eu achei complicado.

Você pode usar “Inserir” para adicionar o valor padrão do menu suspenso e adicioná-lo à sua lista dinâmica: Desta forma, você não precisa usar o Razor em sua Visualização.

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