2009-05-05 5 views
1

Ich arbeite derzeit an einer relativ einfachen MVC-App, die es dem Benutzer erlaubt, einige Suchdaten einzugeben, eine Liste der Ergebnisse zu erhalten und dann jedes Element usw. zu sehen. Alles läuft ziemlich gut, aber ich versuche jetzt, Paging zu implementieren aber einige Probleme haben.ASP.NET MVC Paging - Übergeben von komplexen Typen zurück zum Controller?

Meine Suchformular verwendet HTTP GET Anfordern der folgenden Aktion:

public ActionResult Results(PropertySearchData data, int? page) 
{ 
    ... 
    IEnumerable<Property> search = mService.SearchProperties(data); 

    ViewData["SearchData"] = data; 
    return View("Results", "Site", search.ToPagedList(page ?? 0, 20)); 
    ... 
} 

Von hier aus ich meine Tabelle mit den Ergebnissen aus der IEnumerable Sammlung bauen in meiner Sicht übergeben. Außerdem habe ich ViewData verwendet, um die Suchparameter so zu speichern, dass ich sie weitergeben kann, wenn der Benutzer eine andere Seite anfordert.

Zum Beispiel auf der ersten Seite zu bekommen, würde Ich mag so etwas verwenden:

Html.ActionLink("First", "Results", new { data = ViewData["SearchData"], page = 1 }) 

Wenn jedoch diese Verbindung erzeugt wird, ist meine Verbindung entlang der Linien von

/Results?data=PropertySearchData&page=1 

Wenn ich die ‚Seite‘ Parameter vollständig entfernen, und nur Viewdata übergeben [ „search“] als meine Strecke Wert ist, wird mein Link erzeugt, wie ich möchte (dh jedes Mitglied PropertySearchData entlang als Abfrage-String übergeben durch Ich denke, das liegt daran, dass die Bindung von Modellen nur dann richtig funktionieren kann, wenn Sie haben einen einzelnen Typ angegeben?

Ich kann mehrere Gründe sehen, warum das nicht funktioniert; Worauf ich Probleme habe, ist die "nette" Art und Weise herauszufinden, was ich versuche zu tun. Ich weiß, dass mir hier ein wesentliches Verständnis fehlen muss, daher wäre es sehr zu begrüßen, wenn ich ein paar Hinweise darauf bekommen könnte, wie ich das angehen soll.

Bitte beachte, dass ich wirklich mit HTTP GET haften möge (wie dies zu sehen, ist eine Seite Suchergebnisse).

Danke!

Antwort

2

Das Problem sind die Hilfsmethode nur versucht, es am besten ist, etwas von zu generieren, was Sie ihm gegeben haben, und das ist ein Objekt mit zwei Eigenschaften: Daten und Seite.

die Seitennummer Um in Ihnen Verwendung eines Routen Wert Wörterbuch machen könnte (das ist wahrscheinlich das, was ohnehin unter der Haube getan hat) und die Verwendung der Überschreibung machen, die eine IDictionary akzeptiert: -

//In some HtmlHelper extension method or something 
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]); 
searchCriteria.Add("page", 1); 

return Html.ActionLink("First", "Results", searchCriteria) 
+0

Ah, das ist schön und sauber, danke! – CapBBeard

2

Da data oder ViewData["SearchData"] ist in Instanz PropertySearchData Ich vermute, dass Html.ActionLinkToString() auf sie ruft und das Ergebnis nicht geben Sie es erwarten würden.

1

Erstellen Eine HtmlHelper-Erweiterungsmethode wäre nicht der beste Weg, dies zu lösen. Es wird keine allgemeine Funktionalität hinzugefügt, nur mehr (visuelle) Unordnung ...

Die RouteValues-Überladung von Html.ActionLink erwartet ein Objekt oder RouteValueCollection (IDictionary). Sie verwenden jetzt die Objektüberladung (da der neue Konstruktor {} ein anonymes Objekt ist).

könnten Sie die folgende den richtigen Routevalues ​​Parameter zu erstellen:

new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } } 

Diese mit den aktuellen Suchdaten einen neuen RouteValueCollection initialisiert und fügt dann die ‚Seite‘ Schlüssel mit dem neuen Wert (überschreibt, wenn es vorhanden ist in Suchdaten).