Html.DropdownList Per il valore selezionato non impostato


97

Come posso impostare il valore selezionato di un Html.DropDownListFor? Ho dato un'occhiata online e ho visto che può essere ottenuto utilizzando il quarto parametro così come di seguito:

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

Il mio elenco di selezione viene quindi visualizzato in questo modo:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

Ma per qualche motivo il Regno Unito rimane selezionato ma desidero che sia selezionato "Seleziona un paese".

Qualcuno sa come posso ottenere questo risultato?

MODIFICARE

Ho aggiornato il mio codice in quanto si è verificato un leggero cambiamento nella funzionalità, tuttavia sembra che si verifichi ancora 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 del optionche voglio selezionato, ho provato anche con il testo del optionma anche quello non funziona.

Qualche idea?

Risposte:


181

Il tuo codice presenta 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 una volta inviato il modulo. Quindi, nel tuo caso, dovresti avere un SelectedOrderIdcome parte del tuo modello o qualcosa del genere, per usarlo in questo modo:

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

Secondo ,

A parte l'utilizzo di ViewBag, non è sbagliato ma ci sono modi migliori (inserire invece tali informazioni nel ViewModel), c'è un "piccolo bug" (o un comportamento non controllato) quando la tua proprietà ViewBag, dove stai tenendo il SelectList, è lo stesso nome della proprietà in cui hai inserito il valore selezionato. Per evitare ciò, è sufficiente utilizzare un altro nome quando si nomina la proprietà che contiene l'elenco di elementi.

Un po 'di codice che userei se fossi in te per evitare questi problemi e scrivere un 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")

42
Salvato la mia giornata: "... c'è un piccolo bug quando la tua proprietà ViewBag in cui stai tenendo il SelectList è lo stesso nome della proprietà in cui hai inserito il valore selezionato. Per evitare ciò, usa un altro nome quando nomini la proprietà holding l'elenco degli elementi. " Grazie!
Michael A. Volz aka Flynn

4
Questo "piccolo bug" è una follia assoluta! Ho solo sprecato 2 ore della mia vita a causa di questo. Come può ancora esistere qualcosa di così ovvio e non essere riparato?
cen

1
Flynn, il tuo commento dovrebbe effettivamente essere una risposta. Ho provato implementazioni folli per far funzionare il mio elenco a discesa e questa era la soluzione semplice
Dwayne Hinterlang

2
c'è un piccolo bug ? Non è affatto un bug. L'associazione di modelli funziona legandosi al valore di una proprietà e quando ci si lega al OrderTemplatestentativo di associazione a una ViewBagproprietà che è typeof IEnumerabe<SelectListItem>. Ma un <select>elemento non può legarsi a una raccolta di oggetti complessi (solo un tipo di valore)

Santo cielo avrei sprecato un'intera giornata se non fosse stato per questa risposta. Seriamente, quel PICCOLO BUG è il motivo per cui dovremmo liberarci della viewbag
Worthy7

22

Per me non funzionava, quindi ha funzionato in questo modo:

Controller:

int selectedId = 1;

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

Visualizza:

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

JQuery:

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

2
Il controller ha il numero di parentesi sbagliato: ha una parentesi aperta e due parentesi chiuse.
Amos Long,

La logica di JQuery funziona per me. Grazie.
Shashank

7

Quando passi un oggetto come questo:

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

stai dicendo: la Sorgente ( Model) e la Chiave ( "Code") il Testo ( "Name") e il valore selezionato 0. Probabilmente non hai un 0valore nella tua Codeproprietà source per , quindi l'HTML Helper selezionerà il primo elemento per passare il valore selezionato reale a questo controllo.


3

Assicurati di aver tagliato il valore selezionato prima di assegnare.

//Modello

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

// Controller

var types = new List<SelectType>();
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;

//Visualizza

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

2

Se sai cosa sarà nella vista, puoi anche impostare il valore predefinito anche 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--")

1

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


0

Aggiungi la sezione Controller

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

Aggiungi la sezione Html

   @Html.DropDownList("Orders", null)

Un metodo semplice


Una semplice elaborazione alternativa delle transazioni
ibrahim ozboluk

0

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

0

Linq to Dropdown con elemento vuoto, elemento selezionato (funziona al 100%)
(fortemente tipizzato, possibilità di errore minimo) Eventuali modifiche al modello si rifletteranno nell'associazione

Controller

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

        return View(sur);
    }

Visualizza

        @{


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

È possibile anche questo metodo per l'associazione 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 });

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

0

So che questa non è davvero una risposta alla domanda, ma stavo cercando un modo per inizializzare DropDownList da un elenco al volo nella vista quando ho continuato a imbattermi in questo post.

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

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

Poi sono andato a scavare nel documento ufficiale di msdn e DropDownListForho scoperto che non richiede necessariamente un SelectList, ma piuttosto un IEnumerable<SelectListItem>:

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { 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 il file Model.Locality elemento come selezionato, poiché è a) l'unico elemento eb) lo dice già nelSelectListItem.Selected proprietà.

Nel caso ve lo stiate chiedendo, l'origine dati è una pagina AJAX, che viene caricata dinamicamente utilizzando il controllo SelectWoo / Select2.


0
public byte UserType
public string SelectUserType

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

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

Uso il dizionario Enum per il mio elenco, ecco perché c'è la coppia "chiave", "valore".


0

Ho avuto un problema simile, stavo usando il nome ViewBag e Element allo stesso modo. (Errore di battitura)


0

Si tratta di problemi CSS. Non so perché @ Html.DropDownListFor in Bootstrap 4 funziona. Sicuramente questo è un problema di progettazione di classe. Comunque il lavoro intorno è, se la tua casella di input Dropdown ha Padding CSS: #px, # px; l'elemento quindi disabilitarlo. Spero che funzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.