2010-09-02 3 views
4

Pour soutenir les URL existantes dans mon application, j'utilise une expression régulière pour convertir les URL de la forme /Repo/{ixRepo}/{sSlug}/{sAction} à la nouvelle forme /Repo/{sName}/{sAction}, en utilisant le ixRepo pour obtenir le sName correct . Cela fonctionne bien, et je peux rediriger l'utilisateur vers la nouvelle URL avec un RedirectResult.Vérifiez qu'une carte d'URL à un itinéraire réel dans ASP.Net MVC

Cependant, je voudrais saisir les URL existantes avec une action non valide avant de rediriger l'utilisateur. Comment puis-je vérifier si une chaîne URL va correspondre à un itinéraire enregistré? MVC le fait clairement en interne pour mapper une requête à l'action correcte, mais j'aimerais le faire à la main.

Jusqu'à présent, je suis venu avec ceci:

var rd = Url.RouteCollection.GetRouteData(new HttpContextWrapper(new HttpContext(
    new HttpRequest("", newPath, ""), 
    new HttpResponse(null)))); 

qui semble toujours revenir un System.Web.Routing.RouteData, même pour les mauvaises routes. Je ne peux pas trouver un moyen de vérifier si la route a été acceptée comme un tout attraper, ou si en fait mappage à une route qui est enregistrée sur le contrôleur.

Comment puis-je utiliser le système de routage MVC pour vérifier si une carte d'URL à un contrôleur/action valide par voie recommandée?

(je l'ai vu ASP.NET MVC - Verify the Existence of a Route, mais ce qui est vraiment inélégante. MVC dispose d'un système de routage intégré, et je voudrais l'utiliser.)

Répondre

3

Mauvaise question. Tout ce qui est peut être un itinéraire, qu'il soit ou non mappé à une action.

I pensez-vous vous demandez, "Est-ce que cela va fonctionner, ou est-ce 404?" C'est une question différente.

Pour cela, vous devez faire ce que fait MVC. Regardez dans la source MVC à MvcHandler.ProcessRequestInit puis ControllerActionInvoker.InvokeAction pour voir comment MVC recherche le contrôleur et l'action, respectivement.

1

Si vous connaissez le contrôleur et demander des actions valides, il suffit de faire quelques trucs de réflexion comme cela se fait dans here.

Si l'URL redirigée va à votre application, vous pouvez vérifier si l'URL va à un itinéraire valide. Du code sur haacked.com http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx effectue un test de routage en tant que test unitaire. Après cela, vous avez le contrôleur et l'action en routedata et vous devez faire, ce que Craig a dit "faire la même chose que mvc".
Le système de routage mappe les demandes d'uris vers le gestionnaire d'acheminement. Le gestionnaire d'itinéraire mvc (classe) lève une exception en cas d'échec. Il n'y a pas de vérification.

Vous pouvez ajouter des contraintes à vos itinéraires. Si vous contraignez la propriété d'action. Ensuite, vérifier si l'URL va à un itinéraire valide, soit ce que vous voulez.

+0

Le code lié à l'autre réponse ne vérifie que le jeton 'action' est correct, pas l'ensemble des valeurs de la route (par exemple,' id'). –

Questions connexes