2013-10-28 97 views
0

我有一個場景,在我的項目中,我必須處理Internet和Intranet兩種模式。現在我必須根據模式應用濾波器,根據模式(有條件)應用濾波器的最佳方式是什麼。MVC有條件篩選器提供商

這樣做的一種方法是創建自定義過濾器提供程序並註冊它。但是如何以及何時可以檢查應用程序模式。

感謝, -Babu

+0

通過ip可以很容易地告訴用戶來自內部網或互聯網的什麼網絡,即內部網ip是以10,172還是192開頭的? – Mark

+0

你是正確的,但問題與應用條件過濾器有關。 – Babu

回答

1

讓我們假設你正在使用Phil Haacked's Conditional Filter Provider

public class ConditionalFilterProvider : IFilterProvider { 
    private readonly 
    IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions; 

    public ConditionalFilterProvider(
    IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions) 
    { 
     _conditions = conditions; 
    } 

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

而且你有兩個自定義ActionFilterAttribute,叫IntranetAttribute和InternetAttribute。我們還要說所有的Intranet請求都來自IP地址:10.122.122.12或10.122.122.13。

可以在的Application_Start配置條件提供這樣的:

private void ConfigureModeAttribute() 
    { 
     //Configure a conditional filter 
     string[] intranetIPs = { "10.122.122.12", "10.122.122.13" }; 
     IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions = 
      new Func<ControllerContext, ActionDescriptor, object>[] { 
        (c, a) => intranetIPs.Contains(c.HttpContext.Request.UserHostAddress) ? 
        new IntranetAttribute() : new InternetAttribute() 
      }; 

     var provider = new ConditionalFilterProvider(conditions); 

     // This line adds the filter we created above 
     FilterProviders.Providers.Add(provider); 
    } 

希望它會幫助你的!

+0

感謝您發佈您的答案!請注意,您應該在此處發佈答案的重要部分,在此網站上,或者您的帖子風險被刪除[請參閱常見問題,其中提到的答案几乎不超過鏈接。](http:// stackoverflow。 com/faq#deletion)如果您願意,您可能仍然包含該鏈接,但僅作爲「參考」。答案應該獨立,不需要鏈接。 – Taryn

+0

好的,@bluefeet,我已經充實了。 –

+1

感謝您的回答,這是相同的,我已經實施。 – Babu