【问题标题】:How to make filters in queries optional如何使查询中的过滤器成为可选
【发布时间】:2016-03-09 21:47:24
【问题描述】:

如果参数不存在,如何使绑定到请求参数的查询过滤器不活动?

例如:我有一个查询MyQuery,可以通过投影MyProjection 访问。我在该查询中添加了一个过滤器,我说MyDate 字段应该等于{Request.QueryString:MyDate}。我希望像 ~/MyProjection?MyDate=2016-03-08 这样的 URL 按给定值过滤内容项,但 url ~/MyProjection 只是不按该字段过滤。但这不是发生的情况:无论如何都会将条件添加到查询中,并且其形式为“[minimum DateTime value] < MyDate < [maximum DateTime value]”。这不好,因为它会过滤掉具有 NULL 值的字段。如果我尝试对数字字段做同样的事情,那就更糟了,因为当参数不存在时它会抛出异常。

我知道我可以创建一个新的查询和投影来获得不同的选项,但这似乎有点矫枉过正 - 而且,如果我想创建一个高级搜索表单,它必须以单个投影为目标。

有没有“官方”的方式来做到这一点?还是解决方法?还是 Orchard 根本不支持?

【问题讨论】:

  • 我现在不知道任何官方消息,但作为一种快速解决方法,您可以编写自己的令牌,例如 {Request.QueryStringWithFallback:MyDate} ,例如,如果插入 DateTime.MinValue查询字符串中没有值。
  • 有趣的想法...我不确定它是否会让我超过 NULL 值,但这种方法在某些情况下肯定会很有用。并且令牌似乎是 Orchard 中最容易扩展的点之一。

标签: orchardcms orchardcms-1.9


【解决方案1】:

我不知道开箱即用的方法。但是,您可以很容易地通过实现IFilterProvider 创建具有您想要的行为的自己的过滤器。

看看 Orchard.Projections 模块。在那里您可以找到许多默认查询过滤器(包括您引用的日期字段过滤器)。如果您只需要处理特定案例,您的可能会更简单。

举一个非常简单的例子,查看 Orchard.Tags 模块(查看projections folder)。此文件夹的内容将为您提供开始创建自己的样板所需的几乎所有样板。只需插入您自己的逻辑即可。

【讨论】:

  • 是的,我希望有一个涵盖任何给定领域的解决方案,但您可能是对的,这是修改原始 Orchard 源的唯一方法。 (嗯,我想知道 Orchard.Projections 中的默认过滤器是否可以被覆盖......)
  • 这当然是一个选择。就我个人而言,我会创建一个按照我需要的方式工作的新实现,但是如果它对你更有效,你应该能够抑制默认实现并使用你自己的实现。你会在你的类上使用一个属性,比如 [OrchardSuppressDependency("Orchard.Projections.Providers.Filters.ContentFieldsFilter")]。
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多