2010-04-14 5 views
2

Je me demandais s'il y avait un moyen de créer un ActionLink ou similaire, cela ne change que quelques paramètres de la requête actuelle, et garde tous les autres paramètres intacts . Par exemple si je suis sur une URL comme http://example.com/Posts/Index?Page=5&OrderBy=Name&OrderDesc=True je veux changer seulement le Page, ou le paramètre OrderBy et garder tous les autres paramètres identiques, même ceux que je ne sais pas encore (comme quand je veux ajouter un paramètre Search ou quelque chose de similaire aussi).Comment obtenir tous les paramètres actifs dans ASP.NET MVC (2)

L'en-tête de mon action actuelle ressemble à ceci:

public ActionResult Index(int? Page, string OrderBy, bool? Desc) 

et je suis seulement intéressé par les valeurs que ce contrôleur « Eats ». Je veux cependant que lorsque je prolonge cette action (par exemple avec un paramètre string Search) les liens devraient fonctionner de la même manière qu'avant.

Voici ce que je faisais déjà:

  1. Créer une nouvelle RouteValueDictionary et le remplir avec tout de RouteData.Values
    • Problème: Ce ne remplit que les paramètres qui sont utilisés dans le routage, de sorte que tous les autres les paramètres optionnels (comme Page) au contrôleur sont perdus
  2. Ajoutez tout de HttpContext.Request.QueryString au dictionnaire précédent
    • C'est ce que je suis actuellement en utilisant
    • Problème: Il pourrait avoir des trucs indésirable, que le contrôleur N'a pas demander, et il ne fonctionne pas si la page a été chargée à l'aide POST. Vous aussi n'avez pas ModelBindings (mais ce n'est pas un gros problème, parce que nous sommes tout réémettre de toute façon)
  3. Utilisez HttpContext.Request.Params
    • Problème: cela a trop de données d'ordure qui IMHO il ne faut pas ajouter à une RouteValueDictionary qui est passé à un ActionLink

Ainsi, les questions suivantes:

  1. Existe-t-il un RVD contenant toutes les données transmises au contrôleur et utilisé par celui-ci?
  2. Cette solution est-elle bonne, ou y at-il des mises en garde auxquelles je n'ai pas pensé (principalement dans le contexte de la modification de quelques paramètres de requête tout en gardant les autres intacts)?
  3. Existe-t-il un moyen de filtrer les données "indésirables" de l'objet Params?

EDIT: Vérifié la variable RouteData.DataTokens, mais elle est généralement vide et ne contient pas tout ce dont j'ai besoin. Il semble ne contenir que des paramètres nécessaires pour le routage quelque part, mais pas tous les paramètres.

+1

Avez-vous regardé dans le dictionnaire 'RouteData.DataTokens'? Ils pourraient être là ... S'ils le sont, je le republierai comme une réponse. – Charlino

+0

@Charlino: Voilà où ils devraient être. http://msdn.microsoft.com/en-us/library/system.web.routing.routedata.datatokens.aspx –

+0

Oui, c'est ce que je pensais. Intéressant que vous trouvez 'area' dans DataTokens parce que j'aurais pensé qu'il a été utilisé pour trouver un itinéraire correspondant. – Charlino

Répondre

-1

Regardez RouteData.DataTokens.

RouteData.DataTokens @ MSDN documentation:

Obtient une collection de valeurs de mesure qui sont transmises au gestionnaire d'itinéraire, mais ne sont pas utilisés lorsque le routage ASP.NET détermine si l'itinéraire correspond à une demande.

HTHS,
Charles

+0

Pour moi, la propriété Viewcontext.RouteData.DataTokens est vide (Count == 0), sauf si je définis une route qui nécessite certaines des informations que j'ai fournies, mais ce n'est pas mon propos. Semble que ces paramètres ne sont pas transmis aux gestionnaires d'itinéraire. – SztupY

+0

Cela me cause toujours des problèmes. J'ai une URL comme Source? InvestigationKey = 2. À partir de RouteData.Values ​​je peux seulement obtenir le contrôleur et l'action. Je ne reçois "investigationKey" nulle part. Quelqu'un at-il trouvé comment l'obtenir? – ntombela

Questions connexes