2011-08-16 10 views
22

Nella mia applicazione web sto convalidando l'url da glabal.asax. Voglio convalidare l'url e ho bisogno di reindirizzare a un'azione, se necessario. Sto usando Application_BeginRequest per catturare l'evento della richiesta.Reindirizza a un'azione da global.asax - mvc

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     // If the product is not registered then 
     // redirect the user to product registraion page. 
     if (Application[ApplicationVarInfo.ProductNotRegistered] != null) 
     { 
      //HOW TO REDIRECT TO ACTION (action=register,controller=product) 
     } 
    } 

O c'è altro modo per convalidare ogni URL mentre ottenere richieste in MVC e reindirizzare ad un'azione, se necessario,

+0

Eventuali duplicati di http://stackoverflow.com/questions/580728/redirecting-from-global-asax-in-medium-trust – Baz1nga

risposta

22

Utilizzare il codice qui sotto per il reindirizzamento

Response.RedirectToRoute("Default"); 

"Default" è il nome del percorso. Se si desidera reindirizzare a qualsiasi azione, è sufficiente creare un percorso e utilizzare tale nome di percorso.

+3

Questo creerà un loop – Fourat

+0

@null Pointer, si prega potrebbe accettare uno delle altre risposte che funziona? –

+0

crea il loop come @Fourat ha sottolineato – invertigo

-2

Si può provare con questo:

Context.Response.Redirect() ;

Nt sicuro.

5

Prova questa:

HttpContext.Current.Response.Redirect("..."); 
18

Quanto sopra non funzionerà, sarete nel ciclo di esecuzione del metodo Application_BeginRequest.

è necessario utilizzare

HttpContext.Current.RewritePath("Home/About"); 
+0

Questa è la risposta giusta. – pimbrouwers

0
Response.RedirectToRoute(
           new RouteValueDictionary { 
            { "Controller", "Home" }, 
            { "Action", "TimeoutRedirect" }} ); 
+0

Che non funzionerà in 'Application_BeginRequest'. – AgentFire

+0

Ciò causerà un'altra richiesta; che causerà un'altra richiesta. Quale causa un'altra richiesta. Che crea un altro Fino a quando non viene eliminato completamente. –

2

lo faccio in questo modo:

 HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context); 

     RouteData routeData = new RouteData(); 
     routeData.Values.Add("controller", "Home"); 
     routeData.Values.Add("action", "FirstVisit"); 

     IController controller = new HomeController(); 

     RequestContext requestContext = new RequestContext(contextWrapper, routeData); 

     controller.Execute(requestContext); 
     Response.End(); 

questo modo si avvolge il contesto di richiesta in entrata e reindirizzare ad un altro posto, senza reindirizzare il cliente. Quindi il reindirizzamento non innescherà un altro BeginRequest nel global.asax.

7

Oltre ai modi già menzionati. Un altro modo è usare UrlHelper che ho usato in uno scenario, una volta accadesse di errore e l'utente dovrebbero essere reindirizzati alla pagina di accesso:

public void Application_PostAuthenticateRequest(object sender, EventArgs e){ 
    try{ 
     if(!Request.IsAuthenticated){ 
      throw new InvalidCredentialException("The user is not authenticated."); 
     } 
    } catch(InvalidCredentialException e){ 
     var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
     Response.Redirect(urlHelper.Action("Login", "Account")); 
    } 
} 
+1

Ciò provoca un'altra richiesta. Che a turno ne fa un altro Che ne rende un altro E così via quando sei nella funzione di richiesta application_begin. –

+1

@RichardBarker Questo codice non si trova nella richiesta application_begin !!!!L'ho messo in Application_PostAuthenticateRequest un nel blocco catch in cas error happend –

+0

Le mie scuse. La domanda mostra BeginRequest. Posso suggerire di aggiornare la tua risposta per dimostrarlo e spiegare perché l'hai fatto? –

0

avevo una vecchia applicazione moduli web ho dovuto convertire in MVC 5 e uno dei requisiti stava supportando possibili link {old_form} .aspx. In Global.asax Application_BeginRequest ho impostato un'istruzione switch per gestire le vecchie pagine per reindirizzare a quelle nuove e per evitare il possibile loop indesiderato per il controllo home/default della route per ".aspx" nell'URL raw della richiesta.

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     OldPageToNewPageRoutes(); 
    } 

    /// <summary> 
    /// Provide redirects to new view in case someone has outdated link to .aspx pages 
    /// </summary> 
    private void OldPageToNewPageRoutes() 
    { 
     // Ignore if not Web Form: 
     if (!Request.RawUrl.ToLower().Contains(".aspx")) 
      return; 

     // Clean up any ending slasshes to get to the old web forms file name in switch's last index of "/": 
     var removeTrailingSlash = VirtualPathUtility.RemoveTrailingSlash(Request.RawUrl); 
     var sFullPath = !string.IsNullOrEmpty(removeTrailingSlash) 
      ? removeTrailingSlash.ToLower() 
      : Request.RawUrl.ToLower(); 
     var sSlashPath = sFullPath; 

     switch (sSlashPath.Split(Convert.ToChar("/")).Last().ToLower()) 
     { 
      case "default.aspx": 
       Response.RedirectToRoute(
        new RouteValueDictionary 
        { 
         {"Controller", "Home"}, 
         {"Action", "Index"} 
        }); 
       break; 
      default: 
       // Redirect to 404: 
       Response.RedirectToRoute(
        new RouteValueDictionary 
        { 
         {"Controller", "Error"}, 
         {"Action", "NotFound"} 
        }); 
       break; 

     } 
    }