2013-02-21 18 views
6

Wszystko, próbuję przekierować do strony logowania, jeśli wywołuję wywołanie ajax po przekroczeniu limitu czasu sesji. Oto, co zrobiłem do tej pory.Wywołanie Ajax po przekroczeniu limitu czasu

Należy zdefiniować filtr akcji dla wszystkich akcji.

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" } }); 
       } 
      } 
     } 
    } 

Działa dla nieczynnej akcji ajaxowej po przekroczeniu limitu czasu sesji. Ale w przypadku wywołania ajax. Nie może przekierować do strony logowania, ale zwraca tylko ciąg strony html (wydaje się, że jest to źródłowy kod html dla strony logowania), a nie prawdziwy wynik. Powiedzmy, że mamy kod taki jak ten.

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); 
      } 
     }); 
    } 

Czy ktoś może mi pomóc podać mi jakiś pomysł na rozwiązanie tego problemu? dzięki.

Updated

oparta na MOHSIN i Dave za odpowiedź (dzięki Ci dwa) Oto wreszcie rozwiązanie. Sprawdź to. dzięki.

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" } }); 
        } 
       } 
      } 
     } 
    } 

Po stronie klienta:

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

możesz sprawdzić typ zapytania używając IsAjaxRequest w swoim widoku po przekierowaniu z powyższego filtra i odpowiednio zareagować –

+0

Dobry pomysł, Czy miałeś na myśli 'f ilterContext.HttpContext.Request.IsAjaxRequest'? dzięki. –

+0

Cześć, Mohsin, Dave podał mi więcej szczegółów. Tak więc jedynym sposobem, aby to zrobić, jest wykonanie przekierowania po stronie klienta. Myślę, że to część twojej podłości. –

Odpowiedz

7

połączenia Ajax nie może powrócić przekierowanie jakiegokolwiek rodzaju. W rdzeniu wywołanie AJAX zwraca tylko ciąg znaków. Nie ma takiego silnika, który wykona przekierowanie.

Możesz wykonać przekierowanie po stronie klienta. Jeśli sesja wygasła i po stronie klienta ma swoją metodę Controller 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 }); 
     } 

W funkcji AJAX error:

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

marginesie: był cel ma być „/ Login/Login 'lub'/Account/Login '

+0

Dzięki, Dave, ty i Mohsin Akhtar obaj mają dobrą odpowiedź. –

+0

Witam, Dave, Mógłbyś przejrzeć moją zaktualizowaną zawartość. dzięki. –

Powiązane problemy