Javascript 在ajax方法中调用filterContext.Result操作时,如何重定向页面?

Javascript 在ajax方法中调用filterContext.Result操作时,如何重定向页面?,javascript,c#,asp.net-mvc,asp.net-ajax,actionfilterattribute,Javascript,C#,Asp.net Mvc,Asp.net Ajax,Actionfilterattribute,我遇到了一个我不知道如何解决的问题 我的问题的背景是,当会话变量丢失时,需要将用户重定向到登录 我们所做的是对控制器动作的修饰,它预览执行动作,验证名为[“SesionesPorUsuarios”]的会话变量,其中不同于null 大概是这样的: [HttpPost] [IndicadorUltimaAccionDelSistema()] public JsonResult ConsulteLosProductos(string elAliasDelTipoDeProduc

我遇到了一个我不知道如何解决的问题

我的问题的背景是,当会话变量丢失时,需要将用户重定向到登录

我们所做的是对控制器动作的修饰,它预览执行动作,验证名为[“SesionesPorUsuarios”]的会话变量,其中不同于null

大概是这样的:

    [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" }
                                   });
            }
        }
}
$(function () {
            $(document).ajaxComplete(function (a, xhr, c) {
                if (xhr.status == 403 && xhr.responseText.indexOf("LogOut") != -1) {
                    window.location.href = "@Url.Action("Login", "Login")";
                }
            });
        });
然后像这样:

    [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" }
                                   });
            }
        }
}
$(function () {
            $(document).ajaxComplete(function (a, xhr, c) {
                if (xhr.status == 403 && xhr.responseText.indexOf("LogOut") != -1) {
                    window.location.href = "@Url.Action("Login", "Login")";
                }
            });
        });
我们的登录操作是:

public ActionResult Login()
    {
        return View();
    }
当在类似$.post()的ajax方法中调用操作时,我们遇到了问题

post方法获取操作“Login”返回的所有视图,但它不会将用户重定向到登录页面,post方法获取操作“Login”返回的所有html,并将其视为JSON对象

任何人都知道我们如何解决这个问题,或者我们可以申请什么样的工作来满足需求


谢谢…

您可以更新操作过滤器,以检查请求是否来自ajax调用。如果是,则返回一个json响应,其中包含要重定向到的登录url。您可以通过检查请求中的
“X-request-With”
头来确定它是否是ajax调用。对于ajax请求,该值将是
“XmlHttpRequest”

现在,在您的
$中,发布
方法的回调,检查此数据并执行任何您想要的操作

编辑:基于评论

如果您有许多地方正在进行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-Request-With
头值。如果您正在使用angular js的
$http
服务进行这些调用,则此特定的标头将显示。在这种情况下,您需要特别将其添加到您的通话中

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

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

您必须检查它是否是一个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在帖子中所演示的,我使用字符串使其保持简单:)

我的朋友们,您已经为我们的问题给出了答案,非常感谢

我们解决问题的方法是:

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上进行如下检查:

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

问题解决了,非常感谢。

感谢您的评论,请花时间回答我的问题。该解决方案的问题在于,我们应该更改每个post方法操作调用上的所有代码。如果没有其他解决方案,我们将采用类似的方法,即使这意味着可能的回归。再次感谢您的时间。感谢您的评论并花时间回答我的问题。该解决方案的问题在于,我们应该更改每个post方法操作调用上的所有代码。如果没有其他解决方案,我们将采用类似的方法,即使这意味着可能的回归。再次感谢您的时间。您可以让请求失败变得更容易,让我编辑PostThank@Ehsan Sajjad,我正在尝试在我的项目中应用类似的内容。我将告诉您它是否有效:)根据您的配置,您可能还需要将其添加到您的JsonResult:JsonRequestBehavior=JsonRequestBehavior.AllowGetty您不应该发布自己的答案,而是需要将给定的答案之一标记为答案