Javascript 在ajax方法中调用filterContext.Result操作时,如何重定向页面?
我遇到了一个我不知道如何解决的问题 我的问题的背景是,当会话变量丢失时,需要将用户重定向到登录 我们所做的是对控制器动作的修饰,它预览执行动作,验证名为[“SesionesPorUsuarios”]的会话变量,其中不同于null 大概是这样的: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
[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您不应该发布自己的答案,而是需要将给定的答案之一标记为答案