Html.DropdownListPer il valore selezionato non impostato

Come posso impostare il valore selezionato di un Html.DropDownListFor? Ho dato un’occhiata online e ho visto che può essere raggiunto usando il quarto parametro così come il seguente:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0), "Please select a country") 

La mia lista di selezione quindi viene visualizzata in questo modo:

  Please select a country United Kingdom United States ...  

Ma per qualche motivo il Regno Unito rimane selezionato ma voglio selezionare “Seleziona un Paese”.

Qualcuno sa come posso ottenere questo?

MODIFICARE

Ho aggiornato il mio codice in quanto vi era un leggero cambiamento di funzionalità, tuttavia sembra che si stia ancora imbattendo in questo problema. Questo è ciò che è a mio avviso:

 @Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template") 

1 è l’Id option che voglio selezionare, ho anche provato con il testo option ma anche questo non funziona.

Qualche idea?

Il tuo codice ha alcuni problemi concettuali:

Primo ,

 @Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template") 

Quando si utilizza DropDownListFor, il primo parametro è la proprietà in cui viene memorizzato il valore selezionato dopo aver inviato il modulo. Quindi, nel tuo caso, dovresti avere un object SelectedOrderId come parte del tuo modello o qualcosa del genere, per poterlo utilizzare in questo modo:

 @Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template") 

Secondo ,

A parte l’uso di ViewBag, non è sbagliato ma ci sono modi migliori (metti invece quelle informazioni nel ViewModel), c’è un “piccolo bug” (o un comportamento non previsto) quando la tua proprietà ViewBag, dove stai tenendo la SelectList, è lo stesso nome della proprietà in cui si inserisce il valore selezionato. Per evitare ciò, basta usare un altro nome quando si nomina la proprietà contenente l’elenco di elementi.

Qualche codice che userei se fossi in te per evitare questi problemi e scrivere codice MVC migliore:

ViewModel:

 public class MyViewModel{ public int SelectedOrderId {get; set;} public SelectList OrderTemplates {get; set;} // Other properties you need in your view } 

controller:

 public ActionResult MyAction(){ var model = new MyViewModel(); model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1); //Other initialization code return View(model); } 

Nella tua vista:

 @Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template") 

Per me non stava lavorando così ha funzionato in questo modo:

controller:

 int selectedId = 1; ViewBag.ItemsSelect = new SelectList(db.Items), "ItemId", "ItemName",selectedId); 

Vista:

 @Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect) 

JQuery:

 $("document").ready(function () { $('#ItemId').val('@Model.ItemId'); }); 

Quando si passa un object come questo:

 new SelectList(Model, "Code", "Name", 0) 

stai dicendo, la Fonte ( Model ) e la Chiave ( "Code" ) il Testo ( "Name" ) e il valore selezionato 0 . Probabilmente non hai un valore 0 sul tuo Code sorgente per la proprietà Code , quindi l’helper html selezionerà il primo elemento. Per passare il valore selezionato reale a questo controllo.

Assicurati di aver tagliato il valore selezionato prima di assegnarlo.

//Modello

 public class SelectType { public string Text { get; set; } public string Value { get; set; } } 

// controller

 var types = new List(); types.Add(new SelectType() { Value = 0, Text = "Select a Type" }); types.Add(new SelectType() { Value = 1, Text = "Family Trust" }); types.Add(new SelectType() { Value = 2, Text = "Unit Trust"}); ViewBag.PartialTypes = types; 

//Vista

 @Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" }) 

Se sai cosa sarà nella vista, puoi anche impostare il valore predefinito da Controller piuttosto che impostarlo nel file view / cshtml. Non è necessario impostare il valore predefinito dal lato HTML.

Nel file Controller.

 commission.TypeofCommission = 1; return View(commission); 

Nel file .cshtml.

 @Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--") 

Dovresti dimenticare la lezione

SelectList

Usa questo nel tuo controller:

 var customerTypes = new[] { new SelectListItem(){Value = "all", Text= "All"}, new SelectListItem(){Value = "business", Text= "Business"}, new SelectListItem(){Value = "private", Text= "Private"}, }; 

Seleziona il valore:

 var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private"); if (selectedCustomerType != null) selectedCustomerType.Selected = true; 

Aggiungi l’elenco al ViewData:

 ViewBag.CustomerTypes = customerTypes; 

Usa questo nella tua vista:

 @Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes) 

Maggiori informazioni su: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

Aggiungi la sezione Controller

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid); 

Aggiungi la sezione Html

  @Html.DropDownList("Orders", null) 

Un metodo semplice

Per me soluzione generale 🙂

 @{ var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault(); if (selectedCity != null) { @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" }) } else { @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" }) } } 

Linq a Dropdown con object vuoto, elemento selezionato (funziona al 100%)
(Fortemente digitato, possibilità di errore minimo) Eventuali modifiche al modello si rifletteranno nell’associazione

controllore

 public ActionResult ManageSurveyGroup() { tbl_Survey sur = new tbl_Survey(); sur.Survey_Est = "3"; return View(sur); } 

vista

  @{ //Step One : Getting all the list var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList(); //Step Two : Adding a no Value item ** CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" }); //Step Three : Setting selected Value if value is present var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() }); } @Html.DropDownListFor(model => model.Survey_Est, selListEstd) @Html.ValidationMessageFor(model => model.Survey_Est) 

È anche ansible questo metodo per il binding dei dati

 var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false }); 

So che questa non è davvero una risposta alla domanda, ma stavo cercando un modo per inizializzare la DropDownList da una lista al volo nella vista quando continuavo a inciampare su questo post.

Il mio errore è stato che ho provato a creare una SelectList da un dizionario come questo:

 //wrong! @Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary() { { Model.Locality, Model.Locality_text } }, Model.Locality, ... 

Poi ho iniziato a scavare nel documento msdn ufficiale, e ho scoperto che DropDownListFor non richiede necessariamente una SelectList , ma piuttosto un IEnumerable :

 //right @Html.DropDownListFor(m => m.Locality, new List() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" }) 

Nel mio caso probabilmente posso anche omettere Model.Locality come elemento selezionato, poiché a) l’unico elemento eb) lo dice già nella proprietà SelectListItem.Selected .

Nel caso ve lo stiate chiedendo, l’origine dati è una pagina AJAX, che viene caricata dynamicmente usando il controllo SelectWoo / Select2.

 public byte UserType public string SelectUserType 

Devi prenderne uno e impostarne uno diverso. Il valore selezionato non può essere lo stesso articolo che stai per impostare.

 @Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType)) 

Io uso il dizionario Enum per la mia lista, ecco perché c’è la coppia “chiave”, “valore”.