【问题标题】:Determine if request is PartialView or AJAX request in ASP.NET MVC 3确定请求是 ASP.NET MVC 3 中的 PartialView 还是 AJAX 请求
【发布时间】:2012-10-15 08:49:20
【问题描述】:

我必须授予网站用户访问权限。 我在这里进行过滤:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
}

问题是我无法将完整的视图请求(例如“索引”)与 PartialViewRequests 或 AJAX 调用请求区分开来。

因此页面'Index' 可以访问,但'PartialViewGridViewForIndex' 没有访问权限。

ControllerContext.IsChildAction 属性也无济于事。

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 httprequest


    【解决方案1】:

    您可以使用 IsAjaxRequest 扩展方法来确定是否使用 AJAX 请求来调用此控制器操作:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            // the controller action was invoked with an AJAX request
        }
    }
    

    【讨论】:

    • 我已经测试过了,它可以工作。但是,我不禁要问自己,局部视图渲染是否由 AJAX 请求完成。你有什么想法吗?
    • IsAjaxRequest 告诉您当前请求是否为 AJAX 请求。
    • 如果我想知道它是否是 PartialViewRequest ?
    • 在 ASP.NET MVC 中没有 PartialViewRequest 这样的概念。例如,控制器操作可能会返回 PartialViewResult 或正常的 ViewResult。如果您需要知道控制器操作是否返回局部视图,您不能在 OnActionExecuting 方法内执行此操作,因为此方法在控制器操作运行之前运行。您可以在OnActionExecuted 方法中执行此操作,您可以在其中检查filterContext.Result 的具体类型。例如if (filterContext.Result is PartialViewResult) { ... }
    • 我最近必须执行检查以查看请求是否是部分结果并且是否也有 onexecuting,可以通过使用 routedata 中的操作和控制器来确定它是否是部分视图查看它们是否与请求的 url 匹配,因为 request.url 在您执行返回部分视图的操作时不会更改。但是您需要考虑路由,例如:使用默认路由 (controller/action(id)) 并调用 ~/user 索引不会显示在 url 中。
    【解决方案2】:

    您可以在 asp.net Core 2 中扩展 HttpRequestExtensions,如下所示

    public static class HttpRequestExtensions
    {
        private const string RequestedWithHeader = "X-Requested-With";
        private const string XmlHttpRequest = "XMLHttpRequest";
    
        public static bool IsAjaxRequest(this HttpRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }
    
            if (request.Headers != null)
            {
                return request.Headers[RequestedWithHeader] == XmlHttpRequest;
            }
    
            return false;
        }
    }
    

    并将其用作

     if (!Request.IsAjaxRequest())
     {
        //----
      }
      else
      {
          // -------
      }
    

    【讨论】:

      【解决方案3】:

      我将通过扩展AuthorizeAttribute 创建一个授权过滤器。然后我会将我的代码放在OnAuthorize 覆盖中。在FilterContext 对象中,您可以查看FilterContext.ActionDescriptor.MethodInfo.ReturnType.Name。对于部分视图,这将是 PartialViewResult

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 2011-04-21
        • 2017-06-18
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多