禁用屬性我有我的BaseController類的行爲過濾器屬性:MVC.net特定方法
<CompressFilter()> _
Public Class BaseController
因此,該過濾器被應用到我的應用程序的所有控制器的所有方法。 是否可以禁用某些特定方法的此過濾器?
禁用屬性我有我的BaseController類的行爲過濾器屬性:MVC.net特定方法
<CompressFilter()> _
Public Class BaseController
因此,該過濾器被應用到我的應用程序的所有控制器的所有方法。 是否可以禁用某些特定方法的此過濾器?
如果您有權訪問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()
{
}
希望幫助
不,它不是。當您將操作屬性應用於控制器時,它適用於所有操作。您可能需要將要排除的操作移至其他控制器。
您可以明確地將FilterAttribute應用於方法,而不是應用於所有控制器。 從BaseController類中刪除屬性,並將其僅添加到需要壓縮的方法中。
我的應用程序中有數百種方法。並且只有其中的一些將會禁用此屬性 – Egor4eg 2010-11-26 09:39:05
我可以從BaseController繼承控制器禁用這個屬性呢? – Egor4eg 2010-11-26 09:42:52
什麼意思是禁用屬性?編譯時會在程序集的元數據中烘焙屬性。 – 2010-11-26 09:43:45