2

我來了一個問題,我不知道如何解決。如何在ajax方法中執行filterContext.Result呼叫時重定向頁面?

我的問題的上下文是基於當會話變量丟失時需要將用戶重定向到登錄。

我們正在做的是在該預覽爲執行動作,驗證名爲[「SesionesPorUsuarios」]該會話變量,其中不同的爲空

事情是這樣的控制器操作的裝飾:

[HttpPost] 
    [IndicadorUltimaAccionDelSistema()] 
    public JsonResult ConsulteLosProductos(string elAliasDelTipoDeProducto) 
    { 
     //stuffs... 
    } 

然後是這樣的:

public class IndicadorUltimaAccionDelSistema : ActionFilterAttribute 
{ 

     /stuffs... 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (HttpContext.Current.Session["SesionesPorUsuarios"] != null) 
      {    
       /stuffs... 
      } 
      else 
      { 
       /stuffs... 
       filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary 
            { 
             { "action", "Login" }, 
             { "controller", "Login" } 
            }); 
      } 
     } 
} 

我們的登錄操作是:

public ActionResult Login() 
    { 
     return View(); 
    } 

我們得到了問題,當動作稱爲像$。員額()的方法AJAX

POST方法獲取由行動「登錄」返回的所有觀點,但它不重定向用戶登錄頁面後,post方法獲取由「登錄」操作返回的所有html,並將其視爲JSON對象。

enter image description here

任何人都知道,我們如何解決這個問題,或者我們可以申請什麼workarround對於需要

謝謝...

回答

1

您可以更新您的動作過濾器,以檢查是否請求來自ajax電話或不是。如果是,請返回一個json響應,並將登錄url重定向到。您可以通過檢查請求中的"X-Requested-With"標頭來確定它是否爲ajax呼叫。對於Ajax請求的值將是"XmlHttpRequest"

public override void OnActionExecuting(ActionExecutingContext context) 
{  
    if(YourCodeToCheckWhetherUserIsAuthenticatedHere()==false) 
    { 
     var url = new UrlHelper(context.Controller.ControllerContext.RequestContext) 
                .Action("Login", "Account"); 
     if (context.HttpContext.Request.IsAjaxRequest()) 
     { 
     context.Result = new JsonResult { Data = new { LoginUrl = url} }; 
     } 
     //to do : Non ajax request. keep your existing code 
    } 
} 

現在,在您$.post方法的回電,看看這個數據,做任何你想要的。

編輯:基於註釋

如果你正在Ajax調用很多地方,你可以在全球ajaxComplete事件做此項檢查。

$(function(){ 
    $(document).ajaxComplete(function(a,xhr,c) { 
     if (xhr.status === 401) { 
      var d = $.parseJSON(xhr.responseText); 
      //alert("login failed"); // Let's redirect 
      window.location.href = d.LoginUrl; 
     } 
    }); 
}); 

Request.IsAjaxMethod()檢查X-Requested-With標頭值。如果您使用角度js的$http服務進行這些呼叫,則此特定標頭will not be available。在這種情況下,您需要將其專門添加到您的通話中。

var app= angular.module('yourApp', []); 

app.config(['$httpProvider', function ($httpProvider) { 
    $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; 
}]); 
+0

感謝您的評論,並花時間回答我的問題。 該解決方案的問題是,我們應該更改每個post方法操作調用的所有代碼。 如果沒有另一種解決方案,我們將適用這樣的事情,即使這意味着可能的迴歸。 再次感謝您的時間。 – mmadrigal

3

您必須檢查它是否是一個Ajax請求,發送URL作爲JSON和在客戶端檢查如果參數是通過JS從客戶端有重定向:

if (filterContext.HttpContext.Request.IsAjaxRequest()) 
{ 
    filterContext.HttpContext.Response.StatusCode = 403; 
    filterContext.Result = new JsonResult { Data = "LogOut"}; 
} 
else 
{ 
    filterContext.Result = new RedirectToRouteResult(
           new RouteValueDictionary 
           { 
            { "action", "Login" }, 
            { "controller", "Login" } 
           }); 
} 

和註冊ajaxError事件並在支票價值和重定向:

$(document).ajaxError(function(e, xhr, opts) { 

      if (xhr.status == 403 && xhr.responseText.indexOf("LogOut") != -1) { 
       window.location.href = "@Url.Action("Login", "Account")"; 
      } 

     }); 

現在任何Ajax調用,如果會議是空的用戶會被重定向到登錄的動作。

您還可以返回,而不是字符串對象作爲@Shyju在後表現出來,我使用的字符串來保持它的簡單:)

+0

感謝您的評論,並花時間回答我的問題。 該解決方案的問題是,我們應該更改每個post方法操作調用的所有代碼。 如果沒有另一種解決方案,我們將適用這樣的事情,即使這意味着可能的迴歸。 再次感謝您的時間。 – mmadrigal

+0

你可以讓失敗請求更容易,讓我編輯帖子 –

+0

@mmadrigaln看到我更新的帖子,希望它可以幫助 –

0

我的朋友,你已經給了我們對我們的問題的答案,三江源這麼多。

我們用它來解決這個問題的方法是:

if (filterContext.HttpContext.Request.IsAjaxRequest()) 
       { 
        filterContext.HttpContext.Response.StatusCode = 403; 
        filterContext.Result = new JsonResult { Data = "LogOut" }; 
       } 
       else { 
        filterContext.Result = new RedirectToRouteResult(
             new RouteValueDictionary 
             { 
             { "action", "Login" }, 
             { "controller", "Login" } 
             }); 
       } 

,並檢查它在這樣的全球JS:

$(function() { 
      $(document).ajaxComplete(function (a, xhr, c) { 
       if (xhr.status == 403 && xhr.responseText.indexOf("LogOut") != -1) { 
        window.location.href = "@Url.Action("Login", "Login")"; 
       } 
      }); 
     }); 

的問題解決了,真的很感謝。

+0

你不應該發佈自己的答案,而是你需要標記爲答案給出的答案之一 –