2017-05-02 73 views
1

我有以下的過濾器註冊是否有可能忽略MVC一個單一的篩選器屬性上

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
     { 
      filters.Add(new HandleErrorAttribute()); 
      filters.Add(new CompressContentAttribute()); 
      filters.Add(new MinifyHtmlAttribute()); 

      filters.Add(new MinifyXmlAttribute()); 
     } 

我想在一個特定的動作 忽略CompressContentAttribute()具體的操作方法是有可能在MVC這樣做。 我做了各種研究,他們每個人都顯示如何忽略整個過濾器屬性

回答

0

您需要創建一個自定義過濾器提供程序。這個IFilterProvider接口有一個方法GetFilters。

public class SelectiveFilterProvider : IFilterProvider 
{ 
    private readonly List<Func<ControllerContext, object>> filterconditions = new List<Func<ControllerContext, object>>(); 
    public void Add(Func<ControllerContext, object> mycondition) 
    { 
     filterconditions.Add(mycondition); 
    } 

    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    { 
     return from filtercondition in filterconditions 
       select filtercondition(controllerContext) into ctrlContext 
       where ctrlContext!= null 
       select new Filter(ctrlContext, FilterScope.Global); 
    } 
} 

在Global.asax.cs中

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     MyFilterProvider provider = new MyFilterProvider(); 
     provider.Add(d => d.RouteData.Values["action"].ToString() != "SkipFilterAction1 " ? new CompressContentAttribute() : null); 
     FilterProviders.Providers.Add(provider); 

     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new MinifyHtmlAttribute()); 
     filters.Add(new MinifyXmlAttribute()); 
    } 
相關問題