2013-02-21 19 views
6

Tutti, sto tentando di reindirizzare alla pagina di accesso se si effettua una chiamata ajax durante il timeout della sessione. Ecco cosa ho fatto finora.Chiamata di Ajax in caso di timeout di sessione

Definire un filtro di azione per tutte le azioni.

public class AuthenticateFilterAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      base.OnActionExecuting(filterContext); 
      var routeDataSet = filterContext.RouteData; 
      if (LoginUser.LoginAdministrator == null) 
      { 
       //if the useinfo stored in session is timeout. 
       if (routeDataSet != null 
        && routeDataSet.Values["controller"] != null 
        && routeDataSet.Values["controller"].ToString().ToLower().Equals("login") 
        && routeDataSet.Values["action"] != null 
        && routeDataSet.Values["action"].ToString().ToLower().Equals("login")) 
       { 
        //if it is login action itself.let it be. don't do anything. 


       } 
       else 
       { 
        //redirect to login page. 
        filterContext.Result = new RedirectToRouteResult(
         new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } }); 
       } 
      } 
     } 
    } 

Questo funziona per chiamata azione non ajax quando il timeout di sessione. Ma per la chiamata ajax. Non può reindirizzare alla pagina di login, ma restituire solo una stringa di pagina html (sembra essere il codice html di origine per la pagina di accesso), non il risultato reale. Diciamo che abbiamo un codice come questo.

function ajaxGetLogDetail(logId) { 
     var sUrl = "/LogDetail/index?logId=" + logId; 
     $.ajax({ 
      cache: false, 
      type: "GET", 
      async: false, 
      url: sUrl, 
      success: function (result) { 
       //please note result is html string. not the really result. 
      }, 
      error: function (xhr) { 
       alert(xhr.responseText); 
      } 
     }); 
    } 

Qualcuno potrebbe aiutarmi a darmi qualche indizio per risolvere questo problema? Grazie.

Aggiornato

in base alla risposta del Mohsin e Dave (grazie voi due), Ecco la finalmente soluzione. Si prega di rivederlo. Grazie.

public class AuthenticateFilterAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      base.OnActionExecuting(filterContext); 
      var routeDataSet = filterContext.RouteData; 
      if (LoginUser.LoginAdministrator == null) 
      { 

       //&& routeDataSet != null && routeDataSet.Values["controller"] != null 
       //&& !routeDataSet.Values["controller"].ToString().ToLower().Equals("login") && routeDataSet.Values["action"] != null 
       //&& !routeDataSet.Values["action"].ToString().ToLower().Equals("login") && !filterContext.HttpContext.Request.HttpMethod.ToLower().Equals("get")) 
       if (routeDataSet != null 
        && routeDataSet.Values["controller"] != null 
        && routeDataSet.Values["controller"].ToString().ToLower().Equals("login") 
        && routeDataSet.Values["action"] != null 
        && routeDataSet.Values["action"].ToString().ToLower().Equals("login")) 
       { 



       } 
       else 
       { 
        if (filterContext.HttpContext.Request.IsAjaxRequest()) 
        { 
         filterContext.Result = new JsonResult 
         { 
          Data = new 
          { 
           ErrorMessage = "SystemSessionTimeOut" 
          }, 
          JsonRequestBehavior = JsonRequestBehavior.AllowGet 
         }; 
        } 
        else 
        { 
         filterContext.Result = new RedirectToRouteResult(
          new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } }); 
        } 
       } 
      } 
     } 
    } 

Sul lato client:

function ajaxGetLogDetail(logId) { 
     var sUrl = "/LogDetail/index?logId=" + logId; 
     $.ajax({ 
      cache: false, 
      type: "GET", 
      async: false, 
      url: sUrl, 
      success: function (result) { 
       if (result.ErrorMessage=="SystemSessionTimeOut") 
       { 
        windows.location="/Login/Login"; 
       } 
       else 
       { 
        //... 
       } 
      }, 
      error: function (xhr) { 
       alert(xhr.responseText); 
      } 
     }); 
    } 
+1

puoi verificare il tipo di richiesta utilizzando IsAjaxRequest nella tua vista dopo essere stato reindirizzato dal filtro precedente e rispondere di conseguenza –

+0

Buona idea, intendevi il 'f ilterContext.HttpContext.Request.IsAjaxRequest'? Grazie. –

+0

Ciao, Mohsin, Dave mi ha dato maggiori dettagli. Quindi, l'unico modo per farlo è eseguire un reindirizzamento lato client. Penso che sia la parte del tuo significato. –

risposta

7

chiamate Ajax non può restituire un redirect di qualsiasi tipo. Al centro una chiamata AJAX restituisce solo una stringa. Non esiste alcun tipo di motore che esegua un reindirizzamento.

È tuttavia possibile eseguire un reindirizzamento lato client. Se la sessione è scaduta e sul lato client avere il vostro metodo di controllo return false:

 if !(routeDataSet != null 
     && routeDataSet.Values["controller"] != null 
     && routeDataSet.Values["controller"].ToString().ToLower().Equals("login") 
     && routeDataSet.Values["action"] != null 
     && routeDataSet.Values["action"].ToString().ToLower().Equals("login")) 
     { 
     return Json(new { success = false, message = errorMessage }); 
     } 

Nella funzione AJAX error:

 error: function (xhr) { 
      alert(xhr.responseText); 
      window.location='/Login/Login'; 
     } 

Nota a margine: stata la destinazione significava essere '/ Login/Login 'o'/Account/Login '

+0

Grazie, Dave, tu e Mohsin Akhtar entrambi avete una buona risposta. –

+0

Ciao, Dave, La prego di rivedere il mio contenuto aggiornato. Grazie. –

Problemi correlati