2009-02-26 8 views
5

In meinem Controller, ich habe folgendes:Html.DropDownList in ASP.NET MVC RC (Refresh) nicht vorge Auswahl Artikel

ViewData["myList"] = 
    new SelectList(itemRepository.GetAll(), "Id", "Name", currentItem.Id); 

Und in der Ansicht habe ich:

<%= Html.DropDownList("myItem", (SelectList)ViewData["myList"])%> 

Die gerenderte Drop-Down-Liste sollte das Element mit der Id von currentItem.Id vorausgewählt haben, aber es nicht. Nichts ist ausgewählt, daher wird standardmäßig das erste ausgewählt.

Dies funktionierte, bevor ich auf die RC/RC aktualisiert (aktualisieren). Irgendwelche Ideen?

+0

Dies ist immer noch ein Problem, das ich mit MVC 1.0 konfrontiert –

Antwort

6

Wenn Sie:

<%= Html.DropDownList("NAME_OF_ITEM_ID_PROPERTY", (SelectList)ViewData["myList"]) %> 

Also für Ihr Beispiel, das wahrscheinlich wäre Wenn Sie den Namen des Schlüssels in ViewData mit dem Namen des Formularfelds in der Ansicht verknüpfen, werden die HtmlHelper implizit aus den ViewData-Daten abgeleitet dieser Schlüssel. Ich würde vorschlagen, Ihre Ansicht Code ändern zu:

<%= Html.DropDownList("myList") %> 

Die HtmlHelpers scheinen zu funktionieren am besten, wenn sie auf diese Weise mit (obwohl das nicht immer möglich ist).

Update:

auf den Grund zu erweitern, warum dies, während die anderen Methoden zu arbeiten, scheint nicht, ich in den Code für SelectExtensions.cs Taube ...

auch immer Sie nennen Dropdownlist , die private Methode SelectInternal ist, was schließlich das tatsächliche HTML rendert. Die Signatur für SelectInternal wie folgt aussieht:

SelectInternal(string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool usedViewData, bool allowMultiple, IDictionary<string,object> htmlAttributes) 

Hier ist der Weg, die beiden Verwendungen von Dropdownlist nehmen:

Dropdownlist ("myList")

DropDownList(string name) -> 
SelectInternal(null, name, htmlHelper.GetSelectData(name), true, false, null) 

Dropdownlist ("myItem" , (SelectList) ViewData ["myList"]) DropDown

List(string name, IEnumerable<SelectListItem> selectList) -> 
DropDownList(name, selectList, null /* object, htmlAttributes */) -> 
DropDownList(name, selectList, new RouteValueDictionary(htmlAttributes)) -> 
SelectInternal(null, name, selectList, false, false, htmlAttributes) 

So am Ende des Tages, der Unterschied zwischen den beiden Pfaden ist, dass die Art und Weise, die usedViewData Parameter wahr in SelectInternal Ausweise arbeitet, während die Art und Weise, die nicht passiert falsch funktioniert.

Es scheint mir wahrscheinlich, dass es ein Fehler irgendwo in SelectInternal ist, wenn usedViewDatafalsch ist.

+0

Das funktioniert .. Aber warum ????? –

+0

Akzeptieren als Antwort wie dies funktioniert. Aber @Haacked wird es hoffentlich auch sehen. –

+0

@Troy BTW - Ich sollte klar sein, dass die mehreren Fragezeichen nicht von den MVC Overlords an Sie gerichtet wurden. –

0

Die folgenden Werke für mich (mit MVC RC Refresh)

Nach Ansicht:

<%= Html.DropDownList("Id", (SelectList)ViewData["myList"]) %> 
+0

Hallo Kay, würde das nicht den Namen und die ID "Id" machen? Das wäre falsch, denn ich brauche den Namen und die ID, um "meinItem" zu sein, da dies die ID ist, nach der die Formular-Submission sucht. –

+0

Haben Sie es versucht? Überprüfen Sie auch das gerenderte HTML. So wie ich es verstehe, definieren Sie in Ihrem Controller das Wertfeld als die ID Ihres Artikelmodells und den Namen als Wert für das SelectListItem. Wenn Sie also den ersten Parameter im Dropdown auf Id setzen, fragen Sie nach diesem Wertfeld. –

+0

Ja, ich habe es versucht. Der erste Parameter ist immer der Name des gerenderten Dropdowns. Ist es nicht für dich? –

0

Ich habe einfach meinen eigenen Drop-Down-Helfer gemacht. Vielleicht nicht so effizient wie der eingebaute, aber es funktioniert.

Verwandte Themen