2010-12-20 3 views
0

Ich weiß, dass dies schon einige Male zuvor gefragt wurde, aber die vorhandenen Lösungen sehen eher wie Hacks aus als ein richtiges Muster.Möglicher Fehler in Html.DropDownList, ausgewählte Werte nicht widerspiegelnd?

Ich habe eine einfache Dropdown-Liste. Ich versuche, es mit Daten zu füllen und einen Artikel ausgewählt zu haben. Ich bin erfolgreich bei der "Befüllung mit Datenteil", aber es ist mir nicht gelungen, meinen bevorzugten Artikel vorausgewählt zu bekommen.

Ich benutze ASP.NET MVC 3 RC2.

Die wichtigen Codebits:

{ 
    // Bunch of code 
    CategoryOptions = new SelectList(categories, "Id", "Slug", article.Category.Id); 
} 

Nun ... die CategoryOptions auf die Html-Helfer wie so übergeben wird:

@Html.DropDownListFor(a => a.Category, Model.CategoryOptions) 

ich bei den Werten ausgesehen haben, die in die Helfer übergeben und haben bestätigt, dass für eines der Elemente der ausgewählte Wert auf "true" gesetzt ist:

alt text

Es spiegelt jedoch nicht in dem HTML wider, das vom Helfer erzeugt wird. Keines der Tags ... hat das Attribut selected = "selected".

Ich verwendete Reflektor den Code ein wenig, und diese Linie (SelectExtensions.SelectInternal) sieht dicey zu untersuchen:

item.Selected = (item.Value != null) ? set.Contains(item.Value) : set.Contains(item.Text); 

Bin ich hier etwas falsch? Oder ist das Framework (ASP.NET MVC 3 RC2) hier schuld.

Antwort

1

Ok ... Ich habe es gerade repariert.

Ich habe mein Ansichtsmodell geändert, um eine CategoryId anstelle eines Kategorie-Slugs zu verwenden. So, jetzt bin ich der Meinung wie folgt aussieht:

@Html.DropDownListFor(a => a.CategoryId, Model.CategoryOptions, new { @class = "ask-category-field" }) 

Ich denke, der Modellwert wählen (in diesem Fall a => a.CategoryId) hat den gleichen Typ wie das ausgewählte haben ‚Wert‘. (Ich werde diese Erklärung verfeinern, wenn ich mehr Zeit habe, über den Framework-Code zu gehen.) Aber clevere Codierung in der Tat :) Hüte von ASP.NET MVC Devs.

Jetzt funktioniert es perfekt wie erwartet und behält auch Änderungen an dem ausgewählten Element über einen PRG-Lebenszyklus bei.

Ich hoffe, das hilft jemandem.

0

Die ausgewählte Eigenschaft in einem Dropdown-Element bestimmt nicht das Dropdown-Element, das im HTML ausgewählt werden soll.

Ich habe dieses Problem selbst schon einmal erlebt.

Meine Lösung war eine Erweiterungs-Methode auf der ViewDataDictionary, mit der Sie den Wert einer bestimmten Auswahlliste basierend auf dem ausgewählten Element & eine Zeichenfolge-ID der Auswahlliste festlegen können.

public static void SetSelectedValueFor(this ViewDataDictionary viewDataDictionary, string key, IEnumerable<SelectListItem> items) 
     { 
      // HACK: Store the selected item value in ViewData so that the DropDownListFor knows which one should be selected. 
      // It's a bit of a hack but it seems to be the only way I can do it since DropdownListFor ignores the Selected property on SelectListItem. 
      var x = items.Where(c => c.Selected).FirstOrDefault(); 
      if (x != null) 
      { 
       viewDataDictionary[key] = x.Value; 
      } 
     } 
+0

Danke für die Antwort ... Ich habe auch die Antwort gepostet, die ich Minuten nach dem Posten der Frage gefunden habe. Hoffe das hilft dir auch. – kidoman