2010-11-26 22 views
0

J'ai une fonctionnalité dans l'événement BeginRequest dans global.asax qui analyse l'URL de la requête, vérifie certaines parties de celle-ci et redirige l'utilisateur vers une autre URL.Comment générer l'URL dans global.asax en utilisant ma route. int asp.net mvc

Problème: comment générer l'URL à partir de routeName. Je veux faire ceci, parce que si la route sera changée, la fonctionnalité de redirection fonctionnera. Je n'aime pas le code:

String.Format("{0}/{1}/{2}", host, part1, part2); 

Etant donné que je peux utiliser Url.RouteUrl, mais global.asax je dois créer UrlHelper objet manuellement avec des paramètres RequestContext et RouteData. Où puis-je obtenir l'objet routedata?

Répondre

0

J'ai une fonctionnalité dans l'événement BeginRequest dans global.asax qui analyse l'URL de la requête, vérifie certaines parties de celle-ci et redirige l'utilisateur vers une autre URL.

A plus MVCish façon d'y parvenir serait d'utiliser un custom action filter et effectuer ce traitement dans la méthode OnActionExecuting qui sera appelée avant l'action du contrôleur est invoquée:

public class CustomFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // read some value from the request 
     string value = filterContext.RequestContext.RouteData.Values["someValue"] as string; 
     if (!IsValueValid(value)) 
     { 
      // if the value is invalid redirect to some controller action 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary(new 
       { 
        action = "foo", 
        controller = "bar" 
       }) 
      ); 
     } 
     else 
     { 
      base.OnActionExecuting(filterContext); 
     } 
    } 
} 

Et maintenant tous Il ne reste plus qu'à décorer votre contrôleur de base avec cet attribut afin qu'il s'applique à toutes les actions.

+0

Merci pour la réponse. Mais pour mon cas, je dois traiter cette situation dans global.asax, parce que j'utilise l'unité pour l'injection. Si je choisis le mécanisme d'attribut actionfilter qui crée l'instance de contrôleur sera exécuté et si j'utilise la demande de début aucune action ne sera exécutée. Il plus de haute performance variante –

+0

Une raison particulière pour laquelle vous devez traiter cela dans global.asax? Pourquoi ne pas profiter de ce qu'offre ASP.NET MVC? Je veux dire que vous avez déjà fait le choix d'utiliser ASP.NET MVC alors pourquoi ne pas le faire correctement? –

+0

Je n'ai pas fini ma réponse et appuyez sur Entrée :) Désolé. Je suis nouveau pour empiler le débordement. –