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

mma*_*gal 2 javascript c# asp.net-mvc asp.net-ajax actionfilterattribute

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

我的问题的上下文是基于当会话变量丢失时需要将用户重定向到登录。

我们正在做的是对预览执行动作的控制器动作进行修饰,验证名为 ["SesionesPorUsuarios"] 的会话变量,其中与 null 不同

像这样的东西:

    [HttpPost]
    [IndicadorUltimaAccionDelSistema()]
    public JsonResult ConsulteLosProductos(string elAliasDelTipoDeProducto)
    {
        //stuffs...
    }
Run Code Online (Sandbox Code Playgroud)

然后像这样:

    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" }
                                   });
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

我们的登录操作是:

public ActionResult Login()
    {
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

我们遇到了问题,当在 $.post() 等 ajax 方法中调用操作时

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

在此处输入图片说明

任何人都知道我们如何解决这个问题,或者我们可以根据需要申请什么解决方法

谢谢...

Ehs*_*jad 5

您必须检查它是否是 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" }
                               });
 }
Run Code Online (Sandbox Code Playgroud)

并注册 ajaxError 事件,并在其中检查值和重定向:

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

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

        });
Run Code Online (Sandbox Code Playgroud)

现在在任何 ajax 调用中,如果 session 为空,用户将被重定向到登录操作。

您还可以返回一个对象而不是字符串,如@Shyju 在帖子中演示的那样,我使用字符串来保持简单:)