2016-04-19 14 views
0

Seit 2 Tagen fest auf diesem ... hoffend, dass Sie helfen können.html.dropdownlistfor ausgewählten Wert nicht ausgewählt

Verwenden von VB.Net mit MVC4-Framework.

Ich habe eine Html.DropDownListFor in meiner Ansicht, die wie folgt aussieht:

@Html.DropDownListFor(Function(model) model.Title, New SelectList(Model.Titles, "Key", "Value"), "-select-", New With {.id = "titles", .class = "form-control"}) 

Model.Titles ist ein Dictionary (Of String, String), die so eine kurze Liste ist, dass ich es eher ziehen würde direkt von einer Funktion anstelle der Datenbank. Habe die Idee von hier Wörterbuch Liste zu verwenden:

http://nimblegecko.com/dropdownlistfor-with-dictionaries-in-ASP-NET-MVC-and-why-SelectList-wants-to-kill-you/

Meine Funktion sieht wie folgt aus, die in meinem Modell als Model.Titles

Public Function getAgcRepTitles() As Dictionary(Of String, String) 
Dim list As New Dictionary(Of String, String) 
    list.Add("A/D/SGT", "A/D/SGT") 
    list.Add("A/SGT", "A/SGT") 
    list.Add("CPL", "CPL") 
    list.Add("DET", "DET") 
    Return list 
End Function 

Alles funktioniert super gezogen wird, zeigt es die Liste und speichert den ausgewählten Wert in der Datenbank. Im Debug-Modus, wenn ich die DropDownListFor in der Ansicht erkunde, kann ich sehen, dass Model.Title den richtigen Wert aus der Datenbank abgerufen hat (zB "DET"), und ich kann sehen, dass Model.Titles die obige Liste von meinem enthält Funktion. Aber so sehr ich es auch versuche, ich kann DropDownListFor nicht dazu bringen, Model.Title aus der Liste anzuzeigen.

Das Select-Element im HTML nicht über eine ausgewählte Option, aber ansonsten sieht gut aus:

<select name="Title" class="form-control"> 
    <option value="">-select-</option> 
    <option value="A/D/SGT">A/D/SGT</option> 
    <option value="A/SGT">A/SGT</option> 
    <option value="CPL">CPL</option> 
    <option value="DET">DET</option> 
</select> 

Ich habe versucht, auf die SelectedValue des Select in der Ansicht des Model.Title Wert hinzufügen. Ich habe versucht, eine Liste von SelectListItems anstelle von Dictionary zu verwenden und über Viewbag.myTitles an die View zu senden. Ich habe versucht, Ganzzahlen für die Schlüsselwerte (0,1,2,3 ...) zu verwenden. Nichts funktioniert.

Ich sollte auch hinzufügen, dass ich eine andere DropDownListFor in der gleichen Ansicht, die perfekt funktioniert. Wenn Sie sie vergleichen .... zieht diese ihre Liste aus der Datenbank als SelectListItems in eine SelectList (die Value und Text anstelle von Key und Value verwendet), wobei der Wert eine Ganzzahl ist, die bei Null beginnt und der Text eine Zeichenkette ist .

Wirklich hämmerte mein Kopf mit diesem.

BEARBEITEN: Weitere Informationen. Wenn ich das Formular abschicke, werden die geänderten Daten erfolgreich in die Datenbank hochgeladen, und der Controller sendet die Modelldaten an die Ansicht zurück. Okay .... in DIESER Ansicht die DropDownListFor funktioniert !!! Aber dann klicke ich auf Aktualisieren, und ich verliere meinen ausgewählten Wert von DropDownListFor (obwohl meine Modelldaten IDENTISCH sind).

Hier ist mein Controller:

<AllowAnonymous()> _ 
    Function Update() As ActionResult 

     If WebSecurity.IsAuthenticated Then 
      Dim user = db.AgcRepProfile.Where(Function(AgcRep) AgcRep.Email = WebSecurity.CurrentUserName).ToList 
      If user.Count = 1 Then 
       Dim getAgencies = db.AgencyProfile.Where(Function(Agency) Agency.Active = True).OrderBy(Function(Agency) Agency.Name).ToList 
       ViewBag.myAgencies = New SelectList(getAgencies, "AgcId", "Name") 
       user(0).Titles = New myLists().getAgcRepTitles 
       ViewData("success") = "" 
       Return View(user(0)) 
      End If 
     End If 

     Return RedirectToAction("index", "home") 

    End Function 

    <HttpPost()> _ 
    <ValidateAntiForgeryToken()> _ 
    Function Update(agcrep As AgcRep) As ActionResult 

     If ModelState.IsValid And WebSecurity.IsAuthenticated Then 
      db.Entry(agcrep).State = EntityState.Modified 
      db.SaveChanges() 
      Dim agencies = db.AgencyProfile.Where(Function(Agency) Agency.Active = True).OrderBy(Function(Agency) Agency.Name).ToList 
      ViewBag.myAgencies = New SelectList(agencies, "AgcId", "Name", agcrep.AgcId.ToString) 
      agcrep.Titles = New myLists().getAgcRepTitles 
      ViewData("success") = "changes have been saved" 
     Else 
      ViewData("success") = "Update failed. Please try again."    
     End If 

     Return View(agcrep) 

    End Function 
+0

übergibt Sie Ihren Titel in den letzten Parameter der neuen SelectList-Hilfe? h. 'Neue Auswahlliste (Modell.Titel," Schlüssel "," Wert ", Modell).Titel) ' –

+0

Leider nicht – Pickle

+0

Sind Sie sicher, dass der Wert von' Title' genau mit einem der Optionswerte übereinstimmt (Groß-/Kleinschreibung, kein Leerzeichen usw.)? Der Code, den Sie angezeigt haben, funktioniert einwandfrei. –

Antwort

1

Verstanden! Süßer Jebus, der schmerzhaft war.

Es stellt sich heraus, dass Sie keine ViewData oder ViewBag mit einer Variablen mit demselben Namen wie Ihre Modellvariablen haben können.

Sobald ich den Viewbag ("title") von der Oberseite der Ansicht entfernte, funktionierte mein Model.Title perfekt.

Verwandte Themen