如何使查询中的过滤器可选

How to make filters in queries optional

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

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

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

有没有 "official" 方法来做到这一点?或者解决方法?或者这在 Orchard 中根本不被支持?

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

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

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