2009-10-13 5 views
1

En raison de facteurs extérieurs à mon contrôle, je dois gérer urls comme ceci:Comment type héritage itinéraire urls dans ASP.NET MVC

Je voudrais les acheminer vers un contrôleur/action spécifique avec le val déjà analysé et lié (c'est-à-dire un argument à l'action).

Idéalement mon action ressemblerait à ceci:

ActionResult BackwardCompatibleAction(int val) 

Je trouve cette question: ASP.Net MVC routing legacy URLs passing querystring Ids to controller actions mais les réoriente ne sont pas acceptables.

J'ai essayé des routes qui analysent la partie chaîne de requête, mais toute route avec un point d'interrogation n'est pas valide.

Je suis en mesure d'acheminer la demande avec ceci:

routes.MapRoute(
    "dosomething.asp Backward compatibility", 
    "{dosomething}.asp", 
    new { controller = "MyController", action = "BackwardCompatibleAction"} 
); 

Cependant, à partir de là le seul moyen de se rendre à la valeur de val =? est via Request.QueryString. Alors que je pourrais analyser la chaîne de requête à l'intérieur du contrôleur, cela rendrait le test de l'action plus difficile et je préférerais ne pas avoir cette dépendance. J'ai l'impression qu'il y a quelque chose que je peux faire avec le routage, mais je ne sais pas ce que c'est. Toute aide serait très appréciée.

Répondre

3

Le paramètre val de votre méthode BackwardCompatibleAction doit être renseigné automatiquement avec la valeur de chaîne de requête. Les routes ne sont pas destinées à traiter les chaînes de requête. La solution que vous avez indiquée dans votre question me semble juste. Avez-vous essayé de voir ce qui se passe?

Cela fonctionnerait également pour votre itinéraire. Puisque vous spécifiez à la fois le contrôleur et l'action, vous n'avez pas besoin du paramètre accolade.

routes.MapRoute(
    "dosomething.asp Backward compatibility", 
    "dosomething.asp", 
    new { controller = "MyController", action = "BackwardCompatibleAction"} 
); 

Si vous devez paramétrer le nom d'action, alors quelque chose comme cela devrait fonctionner:

routes.MapRoute(
    "dosomething.asp Backward compatibility", 
    "{action}.asp", 
    new { controller = "MyController" } 
); 

qui vous donnerait un itinéraire plus générique qui pourrait correspondre à plusieurs différentes urls page .asp dans les méthodes d'action .

http://www.bob.com/dosomething.asp?val=42 serait route vers MyController.dosomething(int val)

et http://www.bob.com/dosomethingelse.asp?val=42 ferait passer à MyController.dosomethingelse(int val)

+0

Incroyable. Je l'ai essayé et cela a fonctionné. Shouda vient de l'essayer. Merci!!! –