【问题标题】:MVC Conditional filter ProviderMVC 条件过滤器提供程序
【发布时间】:2014-08-27 12:31:49
【问题描述】:

我有一个场景,在我的项目中,我必须处理 Internet 和 Intranet 两种模式。现在我必须根据模式应用过滤器,根据模式应用过滤器的最佳方法是什么(有条件地)。

一种方法是创建自定义过滤器提供程序并注册它。但是我如何以及何时可以检查应用程序模式。

谢谢, -巴布

【问题讨论】:

  • 是否容易通过 ip 判断用户来自 Intranet 或 Internet 的哪个网络,即 Intranet ip 是否以 10、172 或 192 开头?
  • 没错,但问题与应用条件过滤器有关。

标签: asp.net-mvc asp.net-mvc-4


【解决方案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);
    }

希望对你有帮助!

【讨论】:

  • 感谢您发布您的答案!请注意,您应该在此处、此站点上发布答案的基本部分,否则您的帖子有被删除的风险See the FAQ where it mentions answers that are 'barely more than a link'. 如果您愿意,您仍然可以包含该链接,但仅作为“参考”。答案应该是独立的,不需要链接。
  • 好的,@bluefeet,我已经充实了。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多