DropDownListFür keinen Wert auswählen

83

Ich verwende die DropDownListFor-Hilfsmethode innerhalb einer Bearbeitungsseite und habe kein Glück, dass sie den von mir angegebenen Wert auswählt. Ich habe eine ähnliche Frage zu Stackoverflow bemerkt. Die vorgeschlagene Problemumgehung lautete: "Füllen Sie Ihre SelectList im Ansichtscode aus". Das Problem ist, dass ich das bereits versucht habe und es immer noch nicht funktioniert.

<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>

Ich habe einen Haltepunkt festgelegt und die Existenz (und Gültigkeit) von model.AddressStateAbbr überprüft. Ich bin mir nur nicht sicher, was ich vermisse.

Senfo
quelle

Antworten:

182

Nachdem ich eine Stunde lang recherchiert hatte, fand ich das Problem, das dazu führte, dass die Auswahl nicht eingestellt wurde DropDownListFor. Der Grund dafür ist, dass Sie den Namen von ViewBag genauso verwenden wie die Eigenschaft des Modells.

Beispiel

public  class employee_insignia
{ 
   public int id{get;set;}
   public string name{get;set;}
   public int insignia{get;set;}//This property will store insignia id
}

// If your ViewBag's name same as your property name 
  ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

Aussicht

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")

Die ausgewählte Option wird nicht auf Dropdown-Liste gesetzt, ABER wenn Sie den Namen von ViewBag in einen anderen Namen ändern, wird die ausgewählte Option korrekt angezeigt.

Beispiel

ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

Aussicht

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")
wut-excel
quelle
34
Das ist eigentlich eine richtige Antwort !!! Stellen Sie für alle, die googeln, sicher, dass Sie die ViewBag-Eigenschaft nicht mit der model-Eigenschaft identisch benennen! Ich hatte nicht erwartet, dass dies überhaupt eine Rolle spielt, aber es hat es tatsächlich behoben. Ich bin schockiert.
Tesserex
10
Ich habe das gleiche Problem, obwohl die ViewBag-Eigenschaft einen anderen Namen als die Modelleigenschaft hat:@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Paul Taylor
8
Kennt jemand den Grund, warum sie nicht gleich sein können? Diese Antwort rettete meinen Laptop vor dem Zerschlagen :)
Jeandre Pentz
7
Ich verstehe nicht. Ich habe auch dieses Problem und wir verwenden ViewBag nicht. Auch die Frage verwendete nicht ViewBag
George Mauer
3
Ich halte dies für einen ASP.NET MVC-Fehler!
Néstor Sánchez A.
30

Versuchen:

<%= Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")%>

oder in Razor-Syntax:

@Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")

Die ausdrucksbasierten Helfer scheinen die Selected-Eigenschaft der SelectListItems in Ihrer SelectList nicht zu berücksichtigen.

BnWasteland
quelle
Vielen Dank! Ich brauchte einen schnellen Weg, um meinen ausgewählten Wert aus meinem Datenbank-Repository zu erhalten! Model.AddressStateAbbr war der Teil, den ich brauchte. Süss.
Tom Stickel
29

Wenn Sie es richtig machen und ein Modell verwenden - im Gegensatz zu all diesen ViewBag-Verrückten - und das Problem immer noch sehen, liegt es daran, dass @Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)es nicht MyValuemit den Auswahlmöglichkeiten übereinstimmen kann, die es hat MyOptions. Die zwei möglichen Gründe dafür sind:

  1. MyValueist Null. Sie haben es in Ihrem ViewModel nicht festgelegt. Wenn Sie einen von MyOptionshaben, Selected=truewird dies nicht gelöst.
  2. Subtiler unterscheidet sich der Typ von MyValueden Typen in MyOptions. Wenn dies der Fall MyValueist (int) 1, aber MyOptionses sich um eine Liste gepolsterter Zeichenfolgen handelt {"01", "02", "03", ...}, wird offensichtlich nichts ausgewählt.
Chad Hedgcock
quelle
4
Vielen Dank für diese Antwort. Ich verstehe auch nicht, warum jeder ViewBag verwendet, anstatt ein geeignetes Ansichtsmodell zu erstellen. Diese Antwort starrte mich ins Gesicht und ich schätze es, dass Sie die Punkte verbinden.
Mehrdeutigkeiten
2
# 2 hier ist mein Problem. Ich habe eine Modelleigenschaft, die ein Delegatentyp mit einem benutzerdefinierten Modellordner ist, um den Namen der Methode aufzunehmen und diese Methode tatsächlich aus einer Liste vordefinierter Methodenaufrufe zu binden, die mit der Delegatensignatur übereinstimmen. Hat jemand eine Aufgabe gefunden, um # 2 zu umgehen und sie ohne ein hackiges clientseitiges Skript korrekt auswählen zu lassen?
Mikeschuld
1
Vielen Dank von einem anderen Hipster, der View Models verwendet: D
Vladimir Bozic
1
Für alle, die eine SelectList mit einem anderen Wertattribut als dem Anzeigetext zwischen den Options-Tags haben, zum Beispiel : <option value="2">some text</option>. Es scheint tatsächlich zu versuchen, die Ansichtsmodelleigenschaft mit dem Anzeigetext und nicht mit dem Wertattribut abzugleichen, um die ausgewählte Option auszuwählen. Das ließ mich eine Weile gehen.
Jason Hanson
16

Ohne diese Frage anzusprechen, kann es zukünftigen Googlern helfen, wenn sie meinem Gedankenweg folgen:

Ich wollte eine Mehrfachauswahl und dieser Attribut-Hack auf DropDownListFor wurde nicht automatisch ausgewählt

Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })

Stattdessen hätte ich ListBoxFor verwenden sollen, wodurch alles funktioniert hat

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)
Fiat
quelle
6
Ich bin deinem Gedankenweg gefolgt. Welt: Wenn Sie DropDownListFor und mehrere verwenden, wollten Sie ListBoxFor verwenden.
Scott Stafford
Das ist ärgerlich, dass es funktioniert. An einer anderen Stelle in meinem Code funktioniert DropDownListFor einwandfrei. Ich habe vier oder fünf Stunden damit gespielt, um zu versuchen, es zum Laufen zu bringen. Mein letzter Graben war dieser und es hat funktioniert.
Bryan Hobbs
1

Ich habe auch ein ähnliches Problem und löse es wie folgt, setze das

Die Eigenschaft model.States auf Ihrem Controller entspricht dem, was Sie auswählen müssen

model.States = "Kalifornien"

und dann erhalten Sie "Kalifornien" als Standardwert.

Prageeth Godage
quelle
0

Dieses Problem ist häufig. Ändern Sie den Namen der viewbag-Eigenschaft in einen anderen als den auf der Seite verwendeten Modellvariablennamen.

Seliya Hilal
quelle
0

Eine andere Sache, um zu überprüfen, ob es nicht nur Ihr eigener Code ist, ist sicherzustellen, dass es keine Javascript-Funktion gibt, die den Wert beim Laden der Seite ändert. Nachdem ich stundenlang meinen Kopf gegen eine Wand geschlagen hatte, um all diese Lösungen durchzulesen, stellte ich fest, dass dies mit mir geschah.

BMills
quelle
0

Ich bin kürzlich auf dieses Problem gestoßen. Es machte mich ungefähr eine Stunde lang verrückt. In meinem Fall, ich war nicht mit einer ViewBagVariable mit dem gleichen Namen wie die Modelleigenschaft.

Nach dem Nachverfolgen von Änderungen an der Quellcodeverwaltung stellte sich heraus, dass meine Aktion ein Argument mit demselben Namen wie die Modelleigenschaft hatte:

public ActionResult SomeAction(string someName)
{
    var model = new SomeModel();
    model.SomeNames = GetSomeList();
    //Notice how the model property name matches the action name
    model.someName = someName; 
}

In der Ansicht:

@Html.DropDownListFor(model => model.someName, Model.SomeNames)

Ich habe einfach das Argument der Aktion in einen anderen Namen geändert und es hat wieder funktioniert:

public ActionResult SomeAction(string someOtherName)
{
    //....
}

Ich nehme an, man könnte auch den Eigenschaftsnamen des Modells ändern, aber in meinem Fall ist der Argumentname bedeutungslos, also ...

Hoffentlich erspart diese Antwort jemand anderem die Mühe.

JuanR
quelle
0

Das Problem war zumindest für mich mit dem verbunden IEnumerable<T>.

Grundsätzlich geschah, dass die Ansicht und das Modell nicht dieselbe Referenz für dieselbe Eigenschaft hatten.

Wenn du das tust

IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}

Binden Sie dies dann mit dem

@Html.DropDownListFor(model => model.Id, Model.CoolNames)

Die Ansicht verliert den Überblick über die CoolNames-Eigenschaft. Eine einfache Lösung besteht darin, .ToList()nach dem Erstellen einer Projektion ( .Select());) hinzuzufügen .

jNi
quelle
0

Ich hatte das gleiche Problem. Im folgenden Beispiel Die Variable ViewData ["DATA_ACREDITO_MODELO_INTEGRADO"] verfügt über eine SelectListItem-Liste mit einem ausgewählten Standardwert, das jedoch nicht visuell wiedergegeben wird.

// data 
        var p_estadoAcreditacion = "NO";
        var estadoAcreditacion = new List<SelectListItem>();
        estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)"    , Value = " "    });
        estadoAcreditacion.Add(new SelectListItem { Text = "SI"              , Value = "SI"   });
        estadoAcreditacion.Add(new SelectListItem { Text = "NO"              , Value = "NO"   });

        if (!string.IsNullOrEmpty(p_estadoAcreditacion))
        {
            estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

Ich habe es gelöst, indem ich das erste Argument von DropdownList anders gemacht habe als das id-Attribut.

// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"

...

Pablo Alejandro Perez Acosta
quelle
0

Ich weiß, dass dies eine alte Frage ist, aber ich hatte 2020 das gleiche Problem.

Es stellte sich heraus, dass das Problem darin bestand, dass die Modelleigenschaft "Titel" hieß. Ich habe sie in "GivenTitle" umbenannt und sie funktioniert jetzt wie erwartet.

Von

Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })

zu

Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
Simon
quelle