MVC 筛选器操作重定向

本文关键字:重定向 操作 筛选 MVC | 更新日期: 2023-09-27 17:56:50

我尝试了 2 种不同的方式

这种方式有效,但在执行重定向之前处理操作的所有代码。 这会导致我们使用防伪令牌的问题

    public class CheckAjaxRequestAttribute : ActionFilterAttribute
{
    private const string AJAX_HEADER = "X-Requested-With";
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        bool isAjaxRequest = filterContext.HttpContext.Request.Headers[AJAX_HEADER] != null;
        if (!isAjaxRequest)
        {
            filterContext.HttpContext.Response.Redirect("/");
        }
    }
}

看到的第二种方式建议我收到以下错误"不允许子操作执行重定向操作。"

        public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Buffer = true;
        bool isAjaxRequest = filterContext.HttpContext.Request.Headers[AJAX_HEADER] != null;
        string redirectUrl = string.Format("{0}://{1}/", filterContext.HttpContext.Request.Url.Scheme, filterContext.HttpContext.Request.Url.Authority);
        if (!isAjaxRequest)
        {
            //filterContext.HttpContext.Response.Redirect("/");
            filterContext.Result = new RedirectResult(redirectUrl);
        }
    }
}

这样做的目的是防止在未通过 ajax 调用时加载部分视图。 代码有效,但重定向错误,当@Html.AntiForgeryToken()抛出错误时,我们的安全扫描会捕获问题。

任何帮助将不胜感激。

MVC 筛选器操作重定向

对于您的 isAjaxRequest,您应该能够使用:

filterContext.HttpContext.Request.IsAjaxRequest();