2009-09-16 20 views
6

Ich habe eine Tonne über dieses Problem gelesen, aber ich kann es nicht herausfinden.ASP.NET MVC DropDownList Ausgewählter Wert Problem

Ich habe eine Dropdown-Liste in meiner Ansicht, die für Paging verwendet wird. Sie wählen die Seite aus, zu der Sie wechseln möchten, und das Formular wird gesendet. Wenn die Ansicht zurückgegeben wird, wird die angeforderte Seite angezeigt. Die Dropdownliste ändert sich entsprechend der neu angezeigten Seite. Das funktioniert gut.

Mein Problem ist das: Ich habe 2 Submit-Tasten, eine für die nächste Seite und eine für die vorherige Seite. Wenn in der Steuerung eine der Submits gedrückt wurde, sollte die Seite # um 1 inkrementiert oder dekrementiert werden. Dies geschieht, und die richtige Seite der Daten wird angezeigt. Aber die Dropdown-Liste spiegelt, egal was ich tue, nicht die neue Seitennummer wider, wenn die Ansicht angezeigt wird.

Wenn das Dropdown-Menü vom Benutzer geändert wird, spiegelt es diese Änderungen wider, wenn es nach der Übermittlung eines Formulars zurückgesendet wird. Wenn ich die Seite # programmgesteuert ändere, ändert sich das Dropdown-Menü nicht, obwohl die richtige Seite der Daten angezeigt wird. Hier

ist die Aktionsmethode:

public ActionResult Results(TechSearch search, string NextPage, string PrevPage) 
{ 
    if (NextPage != null) search.Page++; 
    if (PrevPage != null) search.Page--; 

    int resultCount = search.GetResultCount(Desk); 

    List<int> pages = new List<int>(); 
    int pageCount = (int)Math.Ceiling((decimal)resultCount/search.PageSize); 
    for (int i = 1; i <= pageCount; i++) pages.Add(i);   

    ViewData["pages"] = new SelectList(pages, search.Page);    
    ViewData["pageCount"] = pageCount; 

    return View(search); 
} 

Und hier ist der relevante Teil der Ansicht:

<input type="submit" value="<" name="PrevPage" /> 
Page 
<%=Html.DropDownList("Page",(SelectList)ViewData["pages"]) %> 
of 
<%=ViewData["pageCount"]%> 
<input type="submit" value=">" name="NextPage" /> 

Bitte helfen.

EDIT

Seite 333 von Pro ASP.NET MVC Framework by Steven Sanderson:

Wie Input-Steuerelemente ihre Werte Get

Jede [HTML-Helfer für Input-Steuerelemente Rendering] zu bevölkern versucht, sich von der Suche für einen Wert an folgenden Stellen, in dieser Reihenfolge der Priorität:

  1. ViewData.ModelState [ „control“]. Value.RawValue
  2. Wert Parameter HTML-Hilfs-Methode übergeben, oder wenn Sie haben eine Überlastung genannt, die keinen Wert Parameter enthält, dann Viewdata .Eval („control“)

Model ist ein temporärer Speicherbereich, der ASP.NET MVC eingehenden versucht Werte plus Bindungs ​​ und Validierungsfehler behalten verwendet. Beachten Sie, dass es an der Spitze der Prioritätenliste ist, so seine Werte überschreiben alles, was Sie möglicherweise explizit festlegen. Diese Konvention bedeutet, dass Sie einen expliziten Wertparameter übergeben können, der als Standardwert oder Initialwert des Helfers fungiert. aber wenn die Ansicht nach einem Validierungsfehler erneut rendering, wird der Helfer jeden benutzerdefinierten Wert in Präferenz zu diesem Standard beibehalten.

Ich habe überprüft, dass ViewData.ModelState ["Page"]. Value.RawValue enthält die unerwartete Seitennummer, die mich belästigt. Was ist der beste Weg, um dies zu umgehen?

+1

+1 Wirklich nette Verwendung der Zeichenfolgen und Modellbindung, um eine lesbare Analyse zu machen, von denen Senden-Taste gedrückt wurde. –

+0

@Dan - Danke. Ich habe das von Pro ASP.NET MVC Framework von Steven Sanderson im Abschnitt über Wizards und Multistep Forms (S. 396) aufgegriffen. –

+1

Steven Sandersons Buch ist sehr gut. – RichardOD

Antwort

4

Das Problem war, dass die Modeldropdownlist ist in Wert übergeben hielt. Für die Eingabesteuerelemente von HtmlHelper wird ModelState beim Anzeigen eines Werts im Eingabesteuerelement Vorrang vor explizit festgelegten Werten gegeben.

Hier ist, was ich in meiner Aktionsmethode getan habe, das Problem zu beheben:

ModelState.Remove("Page"); 
return View(search); 

ich hört andere Möglichkeiten der Befestigung meines Problems interessiert.

+1

Platzieren Sie die Seitennummer direkt in den Modellstatus innerhalb der Aktion, anstatt sie zu löschen. Ihre Auswahlliste wird nur aus der Seitenliste generiert. – Neal

0

Ändern Sie den ausgewählten Wert mit Javascript auf den Klick auf die nächste oder vorherige Schaltfläche, direkt vor Ihrem Postback.

+0

Ich habe das getan, bevor ich meine Frage gestellt habe und das hat sich darum gekümmert, aber warum funktioniert es sonst nicht? –

+0

Der Browser speichert die Benutzerauswahl zwischen. Mit dem Javascript ändern Sie die Benutzerauswahl (und damit den Eindruck des Browsers der Auswahl), bevor Sie das Postback durchführen. Die Alternative wäre, einen Wert in Ihren Seitenkopf zu setzen, der kein Zwischenspeichern spezifiziert. Das kann oder kann nicht sein, was Sie brauchen, aber ... –

+0

Der Browser sollte nicht im Cache sein. Die Formularmethode ist ein GET. Das bedeutet, dass der Seitenparameter in der URL gesendet wird, wodurch die URL eindeutig wird. –

0
  1. Sind Sie sicher, dass Sie, dass mindestens einer der NextPage oder PrevPage wird null garantiert werden? (Und man bekommt nicht etwas seltsam wie String.Empty eine Zunahme und Abnahme zwingen?)
  2. kann .LastOrDefault() mit nur .Last() ersetzt werden, und Sie sind sicher, dass Sie nicht default(int)-search.Page zuweisen?
+0

1.) Ja bin ich sicher. 2.) Diese Codezeile ist für das Problem nicht relevant. –

0

Hat das Unten irgendeinen Effekt?

ViewData["pages"] = new SelectList(pages, 
            pages.FirstOrDefault(p => p == search.Page)); 

Ersetzen

ViewData["pages"] = new SelectList(pages, search.Page); 
+0

Das hatte keine Wirkung. –

Verwandte Themen