2016-05-03 16 views
1

Während eine Suche nach „Standardwert von Dropdown“ Ergebnissen führen, ist dies nicht eine doppelte Frage, da das spezifische Problem nicht in den Beispielen und Antworten aufgelistet ich gesucht.Standardwert von Dropdownlist in einem Html.BeginForm Block

Hier ist die wichtigste Frage zuerst, gefolgt von Hintergrund und Details unterstützen:

Wenn ich ein Dropdownlist in einem Html.BeginForm Block platzieren, wie kann ich die Standardwerte Dropdownlist sein ein Element habe andere als der erste Punkt in der Liste?

Was ich bisher getan haben:

  • SO, Microsoft Virtual Academy und eine allgemeine Internet-Suche verschiedene Suchbegriffe verwenden, ohne wirksame Antworten, die dieses spezielle Problem zu lösen.
  • Blick auf die Überladungen von Html.DropDownList auf MSDN. Der Parameter optionLabel fügt ein Element ganz oben in der Liste ein, z. B. "Ein Element auswählen", was nicht erwünscht ist.
  • jQuery, die funktioniert funktioniert wie beabsichtigt, aber ich hoffe wirklich, es gibt eine viel einfacher Weg, der jQuery nicht beteiligt ist.

Meine Arbeitstheorie: Die Methode, die ich gelernt (und unten) erlaubt keine Standardwerte, und es ist nicht ein Fall von nicht eine bestimmte Überlastung von Html.DropDownList zu kennen.

Hintergrund Info:

Im Prozess MVC des Lernens 5 und das Sammeln von Anweisungen von Tutorials und SO Antworten, habe ich gelernt, diesen Stil ein Dropdownlist zu erstellen, die innerhalb eines Html.BeginForm() Block in der Ansicht platziert wird. Es funktioniert, wenn ich möchte, dass der Standardwert der erste Eintrag in der Liste ist, oder wenn ich einen Eintrag hinzufügen möchte, der oben heißt "Wähle einen Eintrag".

Es gibt jedoch Zeiten, in denen es sinnvoll ist, dass der Standardwert anders als der erste in der Liste ist.

In der Steuerung werden die Standardwerte des Parameters Index(string campus = "MRA", string fy = "FY16") festgelegt, und die Abfrage gibt das korrekte Ergebnis zurück, aber DropDownLists werden nicht entsprechend festgelegt, wenn die Seite das erste Mal geladen wird.

-Controller

public ActionResult Index(string campus = "MRA", string fy = "FY16") 
{ 
    /* The ViewBags feed DropDownLists used to filter the query */ 
    ViewBag.CampusList = new List<string> { "CRA","DRA","MRA","PRA"}; 
    ViewBag.FyList = new List<string> {"FY15","FY16" }; 

    IEnumerable<AssociatedW3SuspensionOrProbation> query = 
      db.AssociatedW3SuspensionOrProbation 
      .Where(m=>m.Campus==campus).Where(m=>m.FY==fy) 
      .OrderBy(m=>m.StudentName).ThenBy(m=>m.LatestEntryDate); 

    return View(query.ToList()); 
}   

Ansicht Die Dropdown-Listen korrekt funktionieren: wenn das Formular abgeschickt wird, werden die Abfrageergebnisse durch die ausgewählten Drop-Down-Werte ausgewählt und die Dropdown-Listen laden mit den ausgewählten Werten.

@using (Html.BeginForm()) 
{ 
    <div class="panel panel-default"> 
     <div class="panel-body"> 
      <p> 
       <strong>Campus</strong>: @Html.DropDownList("campus", 
        new SelectList(ViewBag.CampusList)) || 

       <strong>FY</strong>: @Html.DropDownList("fy", 
        new SelectList(ViewBag.FyList)) 
      </p> 
      <div><input type="submit" value="Search" /></div> 
     </div> 
    </div> 
} 

Gibt es eine einfache Antwort auf dieses Problem oder erfordert dies einen völlig anderen Ansatz?

+0

Haben Sie die Überlastung von 'neue Select versucht()' die nimmt den ausgewählten Wert als zweiten Parameter? 'neue SelectList (ViewBag.CampusList," MRA ")' –

+0

Warum der Downvote? War die Frage schlecht konstruiert? Habe ich die Frage nicht ausreichend erläutert? Ich bin offen für Kritik, aber es ist nicht konstruktiv oder hilfreich, einfach einen Downvote ohne Erklärung zu bekommen. –

Antwort

2

Was Sie tun müssen, ist SelectList in der Controller-Aktion zu erstellen und es gibt eine Konstruktorüberladung, die verwendet werden kann, um ausgewählte Wert, aber dafür benötigen Sie eine List<T>, die keine Zeichenfolge, sondern ein benutzerdefinierter Typ ist, der 2 enthält Eigenschaften 1 für TextField und 1 für ValueField.

Sie haben zu verwenden second Constructor overload listed here

Hier wird das Codebeispiel ist:

ViewBag.CampusList = new SelectList(
            new List<string> { "CRA","DRA","MRA","PRA"}, 
            campus // selected value 
            ); 
    ViewBag.FyList = new SelectList(
            new List<string> {"FY15","FY16" }, 
            ,fy // selected value 
            ); 

und in der Ansicht:

@Html.DropDownList("campus", 
       ViewBag.CampusList as SelectList) 

@Html.DropDownList("fy", 
       ViewBag.FyList as SelectList) 
+0

Perfekt. Die Änderung, die ich an der Antwort machen würde, ist: 'ViewBag.CampusList = neue SelectList (neue Liste {" CRA "," DRA "," MRA "," PRA "}," MRA ");' –

+0

Die Variable ist in Ihrer Aktion verwendet, um es zu übergeben, sollte dieser Code in Ihrer Aktion sein, ich denke, Sie oben in der Ansicht direkt geschrieben –

+0

Nein, schrieb ich den Standardwert in der Steuerung, wo der ViewBag definiert ist. –