2010-10-20 5 views
2

Compte tenu de ces itinéraires:Pourquoi RedirectToRoute ("Default") ne redirige pas vers la racine?

routes.MapRoute("Test", "test", new { controller = "Test", action = "Index" }); 
routes.MapRoute("Default", "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Si j'appelle RedirectToRoute (« Default ») de l'action Index du TestController redirige vers /test mais je m'y attendais à rediriger vers /

J'ai vérifié le résultat de appelant RedirectToRoute ("Default") avant de le renvoyer pendant une session de débogage.

RedirectToRouteResult résultat = RedirectToRoute ("Default");

Il a une propriété RouteName avec une valeur "Default" et une propriété RouteValues ​​sans éléments (Count = 0). J'ai vérifié en utilisant Reflector, et null est passé en interne en tant que RouteValueDictionary.

Encore une fois, je m'attendrais à ce que, compte tenu des paramètres par défaut de l'itinéraire défini dans mon application, il redirige vers la vue Index sur le HomeController.

Pourquoi ne redirige-t-il pas vers /?

+0

Est-ce que '/ test' est votre racine d'application? Ou '/' est? – abatishchev

+0

'/' est mon application –

Répondre

6

Le RouteValueDictionary renseigné dans l'action en cours est utilisé pour renseigner le Controller, Action, ID. C'est généralement la fonctionnalité que vous voulez et vous permet de faire des choses comme <%:Html.ActionLink("MyAction")%> sans avoir besoin de spécifier votre contrôleur dans une vue.

Pour le forcer à la chute complète par défaut retour il suffit d'utiliser:

RedirectToRoute("default", null");

Le second argument est pour votre routevalues ​​et en spécifiant que vous surchargent les valeurs pré-existantes.

Cependant, je dirais que le meilleur moyen serait d'avoir un itinéraire Home qui ne prendra aucun paramètre. Cela signifie que vos redirections n'auront pas besoin d'un chargement de zéros flottant autour et un appel à RedirectToRoute("Home") est également agréable et explicite.

Modifier

C'est une réponse vraiment vieux et en tant que couple de personnes ont mentionné ne semble pas avoir travaillé pour eux. Pour ce que ça vaut, je n'utilise pas ce modèle et remplace explicitement le contrôleur et la zone quand j'ai besoin de sortir. Non seulement cela fonctionne apparemment mieux, mais quand vous revenez au code, il est bon de voir explicitement que vous sortez de ce contexte et que vous voulez effacer certaines valeurs de route. Pour l'anecdote, j'ai également tendance à privilégier la génération d'URL basée sur des routes nommées plutôt que sur la génération conventionnelle.

+0

Cela ne semble pas fonctionner avec Areas. :( –

2

Sans regarder le code réel pour voir ce qui se passe, il peut être un peu difficile de savoir pourquoi, mais ce poste forum fait la lumière. Le répondeur dit que sous les couvertures, il pourrait être en train de créer un RouteValueDictionary qui contiendrait le contrôleur et l'action dans laquelle vous êtes actuellement, ce qui dans votre cas serait un contrôleur de Test et une action d'Index. Ensuite, lorsque vous appelez RedirectToRoute("Default"), le contrôleur et l'action dans RouteValueDictionary seront utilisés lors de la correspondance de la route par défaut et vous serez redirigé vers l'action Index dans votre contrôleur de test.

Maintenant, vous pouvez toujours faire un Redirect("/") pour vous diriger vers la page principale de votre site.

+1

Redirection ("/") redirigera vers la racine du domaine. C'est un problème si votre site est hébergé dans un sous-répertoire de ce domaine. – Nyatra

2

Je ne pense pas que le paramètre "null" Chao mentions ait jamais fonctionné pour moi. C'est peut-être le cas dans les versions précédentes de MVC, mais maintenant dans MVC 5.2, c'est la seule façon de le faire fonctionner:

RedirectToRoute("Default", new { controller = "", action = "" });