web-dev-qa-db-fra.com

Comment créer les valeurs de route correctes pour ce ActionLink?

Le modèle de SearchResults.aspx est une instance de PersonSearch; lorsque la demande d'une nouvelle page arrive (une demande GET), la méthode d'action doit la prendre et calculer les nouveaux résultats.

[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);
}

Ensuite, je dois générer les liens précédents/suivants:

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

Si j'utilise routeValues = ViewData.Model Je peux voir les propriétés de l'objet passées l'adresse, mais je ne peux pas ajouter le paramètre "page".

18
gremo

Il pense qu'il serait préférable de créer un autre objet avec les valeurs correctes, au lieu d'utiliser (et potentiellement de modifier les valeurs de routage actuelles):

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

Ce billet de blog de Scott Guthrie m'a aidé à comprendre ce qu'est le routage d'URL: ASP.NET MVC Framework (Partie 2): routage d'URL

enter image description hereenter image description here

J'adore qu'il ait inclus des cas de test! enter image description here

6
daniellmb

Vous devez remplacer ToString ().

3
user259437

Si vous utilisez Razor (je me rends compte que OP a demandé il y a quatre ans avant que Razor ne soit inventé, mais les gens qui le trouvent l'utilisent peut-être).

J'ai pu faire fonctionner quelque chose en utilisant une méthode @helper en ligne.

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

L'utilisation serait simple -

@RunnerLink(myPersonSearchInstance, 1)

Ce n'est pas la solution la plus élégante, mais elle fonctionne bien si vous souhaitez passer un objet en tant que routeValue, mais vous devez passer des éléments supplémentaires, tels que Controller, Area ou dans Cas OP page.

2
Nate

Vous devez utiliser RouteLink à la place d'ActionLink. Votre code devrait ressembler à ceci

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