Orchardcms 如何使查询中的筛选器可选

Orchardcms 如何使查询中的筛选器可选,orchardcms,orchardcms-1.9,Orchardcms,Orchardcms 1.9,如果参数不存在,如何使绑定到请求参数的查询筛选器处于非活动状态 例如:我有一个查询MyQuery,可以通过投影MyProjection访问该查询。我向该查询添加了一个过滤器,其中我说MyDate字段应该等于{Request.QueryString:MyDate}。我希望像~/MyProjection?MyDate=2016-03-08这样的url按给定值过滤内容项,但url~/MyProjection不按该字段过滤。但事实并非如此:一个条件无论如何都会添加到查询中,其形式为“[最小日期时间值]

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

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

我知道我可以创建一个新的查询和投影以获得不同的选项,但这似乎是一种过分的做法——而且,如果我想创建一个高级搜索表单,它必须针对单个投影


有没有一个“官方”的方法来做到这一点?还是解决办法?或者这在Orchard中根本不受支持?

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

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


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

我现在不知道任何官方消息,但作为一种快速解决方法,您可以编写自己的令牌,如{Request.QueryStringWithFallback:MyDate},例如,如果查询字符串上没有值,可以插入DateTime.MinValue。有趣的想法。。。我不确定它是否能让我通过空值,但这种方法在某些情况下肯定是有用的。而且令牌似乎是Orchard中最容易扩展的点之一。是的,我希望找到一个覆盖任何给定字段的解决方案,但您可能是对的,这是修改原始Orchard源代码的唯一方法。(嗯,我想知道Orchard中是否存在默认过滤器。投影可以被覆盖…)这当然是一个选项。就我个人而言,我会创建一个按照我需要的方式工作的新实现,但是您应该能够抑制默认实现,并使用自己的实现,如果这样对您更有效的话。您可以在类中使用类似于[OrchardSuppressDependency(“Orchard.Projections.Providers.Filters.ContentFieldsFilter”)的属性。