2012-02-15 51 views
0

我注意到,如果我的會話在我的站點上過期,然後點擊Ajax.ActionLink,登錄頁面將顯示在PartialView中。我已經創建了OnActionExecuting方法的重寫,像這樣:ASP.NET MVC-無法加載Response.Redirect中的資源

protected override void OnActionExecuting(ActionExecutingContext ctx) 
    { 
     if (!ctx.HttpContext.User.Identity.IsAuthenticated) 
     { 
      if (ctx.RequestContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       //ctx.RequestContext.HttpContext.Response.RedirectToRoute(new { controller = "Account", action = "LogOn" }); 
       ctx.RequestContext.HttpContext.Response.Redirect(Url.RouteUrl(new { controller = "Account", action = "LogOn" })); 
      } 
     } 
    } 

如果用戶被認證,然後,如果請求是一個AjaxRequest此檢查。如果用戶不再對Ajax actionlink進行身份驗證,它會將用戶重定向到我的賬戶控制器中的LogOn方法。問題是我在控制檯中得到「無法加載資源」。

回答

1

這將檢查用戶是否已通過認證,然後如果請求是 AjaxRequest。然後,將用戶重定向到登錄方法在我 賬戶控制,如果他們不再爲驗證一個Ajax ActionLink的

是的,但如果你配置了Ajax.ActionLinkAjax.BeginForm更新與一些DOM元素使用AjaxOptions的AJAX請求的結果,如果您在服務器上重定向,則無關緊要。 AJAX請求將簡單地遵循重定向,並將重定向到的HTML(/ Account/LogOn)插入到DOM元素中。

因此,從AJAX請求重定向不會解決您的問題。正如你所知道的,AJAX請求的重點在於保持在同一頁面上(地址欄永遠不會改變)。

如果你想處理驗證cookie過期情況以適當方式在您的Ajax請求,你將不得不(使用window.location.href)在客戶端上執行重定向。爲了達到這個目的,你可以看一下following blog post,其中Phil Haack公開了一種很棒的技術,允許你的服務器在這種情況下發送401 HTTP狀態碼,而不是重定向。然後在客戶端上,你可以攔截這些代碼(例如通過訂閱全局的AJAX處理程序)並重定向到客戶端的登錄頁面。