MVC.net禁用特定方法的属性

时间:2010-11-26 09:34:44

标签: asp.net-mvc

我的BaseController类上有一个动作过滤器属性:

<CompressFilter()> _
Public Class BaseController

因此,此过滤器适用于我的应用程序的所有控制器中的所有方法。 是否可以针对某些特定方法禁用此过滤器?

3 个答案:

答案 0 :(得分:3)

如果您可以访问CompressFilter的代码,那么它就是。您可以添加第二个属性。例如NoCompressAttribute。在CompressFilter的OnActionExecuting方法中,您将查看ActionDescriptors,如果应用了NoCompressAttribute,则不会进行压缩。

编辑:这是代码

 public class CompressFilter : ActionFilterAttribute
    {
        public bool Compress { get; set; }
        public CompressFilter()
        {
            Compress = true;
        }

        public CompressFilter(bool compress)
        {
            Compress = compress;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var compressAttribs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(CompressFilter), true);
            foreach (var item in compressAttribs)
            {
                if (!((CompressFilter)item).Compress)
                {
                    return;
                }
            }

            HttpRequestBase request = filterContext.HttpContext.Request;

            string acceptEncoding = request.Headers["Accept-Encoding"];

            if (string.IsNullOrEmpty(acceptEncoding)) return;

            acceptEncoding = acceptEncoding.ToUpperInvariant();

            HttpResponseBase response = filterContext.HttpContext.Response;

            if (acceptEncoding.Contains("GZIP"))
            {
                response.AppendHeader("Content-encoding", "gzip");
                response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
            }
            else if (acceptEncoding.Contains("DEFLATE"))
            {
                response.AppendHeader("Content-encoding", "deflate");
                response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
            }
        }
    }

然后在你不想压缩的动作上执行:

[CompressFilter(false)]
public virtual ActionResult Index()
{
}

希望有所帮助

答案 1 :(得分:1)

不,不是。将操作属性应用于控制器时,它适用于所有操作。您可能需要将要排除的操作移动到其他控制器。

答案 2 :(得分:-1)

您可以显式地将FilterAttribute应用于方法,而不是应用于所有控制器。 从类BaseController中删除属性,并将其仅添加到需要压缩的方法中。