Question

Je travaille actuellement sur une application MVC relativement simple qui permet à l'utilisateur de saisir des données de recherche, d'obtenir une liste de résultats, puis d'afficher chaque élément, etc. Tout se passe plutôt bien, mais j'essaie maintenant de mettre en œuvre pagination mais avoir des problèmes.

Mon formulaire de recherche utilise HTTP GET, demandant l'action suivante:

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

À partir de là, je construis ma table de résultats à partir de la collection IEnumerable passée dans ma vue. De plus, j'ai utilisé ViewData pour conserver les paramètres de recherche afin de pouvoir les transmettre lorsque l'utilisateur demande une page différente.

Par exemple, pour accéder à la première page, j'aimerais utiliser quelque chose comme ceci:

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

Cependant, lorsque ce lien est généré, mon lien suit les lignes de

/Results?data=PropertySearchData&page=1

Si je supprime entièrement le paramètre 'page' et que je passe juste ViewData [" SearchData &] comme valeur de route, mon lien est généré comme je le souhaiterais (c'est-à-dire que chaque membre de PropertySearchData est transmis sous forme de chaîne de requête J'imagine que c'est parce que la liaison de modèle ne peut fonctionner correctement que si vous avez spécifié un seul type?

Je vois plusieurs raisons pour lesquelles cela ne fonctionne pas; Ce qui me pose problème, c’est de trouver la «bonne» façon de faire ce que j’essaie de faire. Je sais que je dois manquer d’un élément de compréhension essentiel ici. C’est pourquoi je serais très reconnaissant si je pouvais obtenir quelques conseils sur la façon d’aborder cela.

Notez que je souhaite vraiment rester avec HTTP GET (car il s’agit d’une page de résultats de recherche).

Merci!

Était-ce utile?

La solution

Le problème est que la méthode d'assistance essaie simplement de générer quelque chose à partir de ce que vous lui avez donné. Il s'agit d'un objet avec deux propriétés: data et page.

Pour obtenir le numéro de page, vous pouvez utiliser un dictionnaire de valeurs de route (ce qui est probablement le cas sous le capot) et utiliser le remplacement qui accepte un IDictionary: -

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

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

Autres conseils

Puisque data ou ViewData [" SearchData &]; est dans l'instance de PropertySearchData , je suppose que Html.ActionLink appelle ToString () et ne donne pas le résultat escompté.

Créer une méthode d’extension HtmlHelper ne serait pas le meilleur moyen de résoudre ce problème. Il n’ajoutera pas de fonctionnalité générale, mais plus de fouillis (visuel) ...

La surcharge routeValues ??de Html.ActionLink attend un objet ou RouteValueCollection (IDictionary). Vous utilisez maintenant la surcharge d'objet (car le nouveau constructeur {} est un objet anonyme).

Vous pouvez utiliser les éléments suivants pour créer le paramètre routeValues ??correct:

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

Ceci initialise une nouvelle RouteValueCollection avec les données de recherche actuelles, puis ajoute la clé "page" avec la nouvelle valeur (écrase si elle existe dans les données de recherche).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top