Html.DropdownListFür den ausgewählten Wert, der nicht festgelegt wird


97

Wie kann ich den ausgewählten Wert eines Html.DropDownListFor festlegen? Ich habe online nachgesehen und festgestellt, dass dies mithilfe des vierten Parameters wie folgt erreicht werden kann:

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

Meine Auswahlliste wird dann folgendermaßen angezeigt:

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

Aus irgendeinem Grund bleibt Großbritannien ausgewählt, aber ich möchte, dass "Bitte ein Land auswählen" ausgewählt wird.

Weiß jemand, wie ich das erreichen kann?

BEARBEITEN

Ich habe meinen Code aktualisiert, da sich die Funktionalität geringfügig geändert hat, dieses Problem jedoch immer noch auftritt. Das ist aus meiner Sicht:

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

1Ist die ID der, die optionich auswählen möchte, habe ich auch mit dem Text der versucht, optionaber das funktioniert auch nicht.

Irgendwelche Ideen?

Antworten:


181

Ihr Code weist einige konzeptionelle Probleme auf:

Erstens ,

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

Bei Verwendung von DropDownListFor ist der erste Parameter die Eigenschaft, in der Ihr ausgewählter Wert gespeichert wird, sobald Sie das Formular senden. In Ihrem Fall sollten Sie also ein SelectedOrderIdTeil Ihres Modells oder ähnliches haben, um es folgendermaßen zu verwenden:

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

Zweitens ,

Abgesehen von der Verwendung von ViewBag ist dies nicht falsch, aber es gibt bessere Möglichkeiten (diese Informationen stattdessen in das ViewModel einfügen ). Es gibt einen "kleinen Fehler" (oder ein unerwartetes Verhalten), wenn sich Ihre ViewBag-Eigenschaft, in der Sie die SelectList halten, befindet Der gleiche Name der Eigenschaft, in die Sie den ausgewählten Wert eingefügt haben. Um dies zu vermeiden, verwenden Sie einfach einen anderen Namen, wenn Sie die Eigenschaft benennen, die die Liste der Elemente enthält.

Ein Code, den ich verwenden würde, wenn ich Sie wäre, um diese Probleme zu vermeiden und besseren MVC-Code zu schreiben:

Ansichtsmodell:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

Regler:

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

   return View(model);
}

Aus Ihrer Sicht:

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

42
Ich habe meinen Tag gerettet: "... es gibt einen kleinen Fehler, wenn Ihre ViewBag-Eigenschaft, in der Sie die SelectList halten, derselbe Name der Eigenschaft ist, in der Sie den ausgewählten Wert eingegeben haben. Um dies zu vermeiden, verwenden Sie einfach einen anderen Namen, wenn Sie die Eigenschaft halten die Liste der Elemente. " Danke dir!
Michael A. Volz alias Flynn

4
Dieser "kleine Käfer" ist absoluter Wahnsinn! Ich habe gerade 2 Stunden meines Lebens damit verschwendet. Wie kann etwas so Offensichtliches noch existieren und nicht gepatcht werden?
cen

1
Flynn, dein Kommentar sollte eigentlich eine Antwort sein. Ich habe verrückte Implementierungen versucht, um meine Dropdown-Liste zum Laufen zu bringen, und dies war die einfache Lösung
Dwayne Hinterlang

2
gibt es einen kleinen Fehler ? Es ist überhaupt kein Fehler. Die Modellbindung funktioniert durch Bindung an den Wert einer Eigenschaft und wenn Sie an OrderTemplatesIhren Versuch binden, an eine ViewBagEigenschaft vom Typ zu binden IEnumerabe<SelectListItem>. Ein <select>Element kann jedoch nicht an eine Sammlung komplexer Objekte (nur einen

Heiliger Mist, ich hätte einen ganzen Tag verschwendet, wenn diese Antwort nicht gewesen wäre. Im Ernst, dieser kleine Fehler ist der Grund, warum wir auf die Sichttasche
steigen

22

Für mich hat das nicht so geklappt:

Regler:

int selectedId = 1;

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

Aussicht:

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

JQuery:

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

2
Ihr Controller hat die falsche Anzahl von Klammern: Er hat eine öffnende Klammer und zwei schließende Klammern.
Amos Long

Die JQuery-Logik funktioniert bei mir. Danke dir.
Shashank

7

Wenn Sie ein Objekt wie folgt übergeben:

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

Sie sagen: die Quelle ( Model) und der Schlüssel ( "Code"), den Text ( "Name") und den ausgewählten Wert 0. Sie haben wahrscheinlich keinen 0Wert für die CodeEigenschaft in Ihrer Quelle , daher wählt der HTML-Helper das erste Element aus, das den tatsächlichen ausgewählten Wert an dieses Steuerelement übergibt.


3

Stellen Sie sicher, dass Sie den ausgewählten Wert gekürzt haben, bevor Sie ihn zuweisen.

//Modell

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

//Regler

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;

//Aussicht

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

2

Wenn Sie wissen, was in der Ansicht angezeigt wird, können Sie den Standardwert auch über Controller festlegen, anstatt ihn in der Datei view / cshtml einzurichten. Es ist nicht erforderlich, den Standardwert von der HTML-Seite festzulegen.

In der Controller-Datei.

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

In der .cshtml-Datei.

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

1

Du solltest die Klasse vergessen

SelectList

Verwenden Sie dies in Ihrem Controller:

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

Wählen Sie den Wert:

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

Fügen Sie die Liste zu den ViewData hinzu:

ViewBag.CustomerTypes = customerTypes;

Verwenden Sie dies in Ihrer Ansicht:

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

- -

Weitere Informationen unter: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc


0

Fügen Sie den Controller-Bereich hinzu

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

Fügen Sie den HTML-Abschnitt hinzu

   @Html.DropDownList("Orders", null)

Eine einfache Methode


Eine einfache alternative Transaktionsverarbeitung
ibrahim ozboluk

0

Für mich allgemeine Lösung :)

@{
     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 mit leerem Element, ausgewähltem Element (funktioniert 100%)
(stark typisiert, minimale Fehlerwahrscheinlichkeit) Alle Modelländerungen werden in der Bindung berücksichtigt

Regler

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

        return View(sur);
    }

Aussicht

        @{


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

Diese Methode zum Binden von Daten ist ebenfalls möglich

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

Ich weiß, dass dies nicht wirklich eine Antwort auf die Frage ist, aber ich suchte nach einer Möglichkeit, die DropDownList aus einer Liste im laufenden Betrieb in der Ansicht zu initialisieren, als ich immer wieder auf diesen Beitrag stieß.

Mein Fehler war, dass ich versucht habe, eine SelectList aus einem Wörterbuch wie folgt zu erstellen:

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

Ich habe dann im offiziellen msdn-Dokument nachgesehen und festgestellt, dass DropDownListFordies nicht unbedingt ein SelectList, sondern ein IEnumerable<SelectListItem>: erfordert.

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

In meinem Fall kann ich wahrscheinlich auch das Model.Localityausgewählte Element weglassen , da es a) das einzige Element ist und b) es bereits in derSelectListItem.Selected Eigenschaft .

Für den Fall, dass Sie sich fragen, ist die Datenquelle eine AJAX-Seite, die mithilfe des SelectWoo / Select2-Steuerelements dynamisch geladen wird.


0
public byte UserType
public string SelectUserType

Sie müssen eine bekommen und eine andere einstellen. Der ausgewählte Wert kann nicht mit dem Element übereinstimmen, das Sie festlegen möchten.

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

Ich verwende das Enum-Wörterbuch für meine Liste, deshalb gibt es ein Paar "Schlüssel", "Wert".


0

Ich hatte ein ähnliches Problem, ich habe den Namen ViewBag und Element als denselben verwendet. (Tippfehler)


0

Dies sind CSS-Probleme. Ich weiß nicht, warum @ Html.DropDownListFor in Bootstrap 4 am besten funktioniert. Dies ist sicherlich ein Problem beim Klassendesign. Wenn Ihr Dropdown-Eingabefeld über CSS-Auffüllung verfügt, ist die Arbeitsumgebung wie folgt: #px, # px; Element dann deaktivieren Sie es. Hoffe das wird funktionieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.