2009-11-27 17 views
16

Model SearchResults.aspx jest instancją PersonSearch; gdy pojawi się żądanie nowej strony (żądanie GET), metoda działania powinna go przyjąć i obliczyć nowe wyniki.Jak utworzyć prawidłowe wartości trasy dla tego łącza 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); 
} 

Wtedy muszę generować poprzedni/następny linki:

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

Jeśli używam routeValues = ViewData.Model widzę właściwości obiektów przeszły adres, ale nie mogę dodać „strony” parametr .

Odpowiedz

24

To, że byłoby lepiej, aby utworzyć inny obiekt z prawidłowymi wartościami, zamiast korzystania (i potencjalnie zmieniając bieżące routevalues):

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

uzyskać:? Searchresults szukaj = RegistryManager.Models.PersonSearch & page = 1 – gremo

+4

nie działa ... przechodzi nazwę klasy, a nie klucz/wartości par odpowiadających właściwości obiektu ... – gremo

3

Trzeba zastąpić toString().

2

Jeśli używasz maszynki do golenia (zdaję sobie sprawę, PO poprosił cztery lata temu przed Razor został wymyślony, ale ludzie ze znalezieniem tego może go używać).

Udało mi się uzyskać coś działającego za pomocą wbudowanej metody @helper.

@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) 
} 

Wykorzystanie byłoby proste -

@RunnerLink(myPersonSearchInstance, 1) 

To nie jest najbardziej eleganckie rozwiązanie, ale działa dobrze, jeśli chcesz przekazać obiekt w postaci routeValue, ale trzeba zdać dodatkowe pozycje, takie jak Controller, Area lub w przypadku OP page.

1

Musisz użyć RouteLink zamiast ActionLink. Kod powinien wyglądać mniej więcej tak

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