2009-11-27 8 views
16

Das Modell SearchResults.aspx ist eine Instanz von PersonSearch; Wenn die Anforderung für eine neue Seite eintrifft (eine GET-Anforderung), sollte die Aktionsmethode sie übernehmen und die neuen Ergebnisse berechnen.Wie erstelle ich die richtigen Routenwerte für diesen ActionLink?

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult SearchResults(PersonSearch search, int? page) 
{ 
    ViewData["Results"] = new PaginatedList<Person>(_searchService.FindPersons(search), page ?? 0, 1); 
    return View("SearchResults", search); 
} 

Dann muss ich die vorherigen/nächsten Links generieren:

<%= Html.ActionLink("Next Page >", "SearchResults", routeValues) %> 

Wenn ich routeValues = ViewData.Model verwenden kann ich die Objekteigenschaften finden Sie in der Adresse übergeben, aber ich kann die „Seite“ Parameter nicht hinzufügen .

Antwort

24

Es denkt, es wäre besser, ein anderes Objekt mit den richtigen Werten zu erstellen, anstatt mit (und möglicherweise den aktuellen Routevalues ​​zu verändern):

<%=Html.ActionLink("Next Page >", "SearchResults", new { 
    search = this.Model, 
    page = 1 //or whatever 
}) %> 
+0

aussehen sollte ich: Search suchen = RegistryManager.Models.PersonSearch & page = 1 – gremo

+4

Funktioniert nicht ... es übergibt den Namen der Klasse, nicht die Schlüssel/Wert-Paare entsprechend die Objekteigenschaften ... – gremo

3

Sie müssen ToString außer Kraft zu setzen(). Dieser Blog-Eintrag von Scott Guthrie

2

Wenn Sie Razor verwenden (ich weiß, dass OP vor vier Jahren gefragt wurde, bevor Razor erfunden wurde, aber Leute, die das vielleicht benutzen).

Ich konnte etwas mit einer [email protected] arbeiten.

@helper RunnerLink(PersonSearch model, int page) 
{ 
    var routeParms =new RouteValueDictionary(model.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(model, null))); 
    routeParms.Add("page", page.ToString()); 
    routeParms.Add("Controller", "Property"); 
    @Html.ActionLink("Search", "Index", routeParms) 
} 

Verwendung wäre einfach -

@RunnerLink(myPersonSearchInstance, 1) 

Es ist nicht die eleganteste Lösung, aber es funktioniert gut, wenn Sie ein Objekt in als routeValue übergeben wollen, aber Sie müssen passieren zusätzliche Elemente, wie Controller, Area oder in OP-Fall page.

1

Sie müssen stattdessen RouteLink anstelle von ActionLink verwenden. Ihr Code so etwas wie dieses

@Html.RouteLink("Next", new {controller = "SearchResults", action = "Index", search=samevalue, page=1 }) 
Verwandte Themen