2014-10-05 216 views
0

我有一些位置来过滤器(比方说,查询字符串):CAML过滤在服务器端

<ParameterBinding Name="param" Location="QueryString(param)"/> 

我知道如何给该参数传递给CAML查询,这将是这样的:

<Where> 
    <Eq> 
    <FieldRef Name='SomeField'/> 
    <Value Type='Text'>{param}</Value> 
    </Eq> 
</Where> 

但是,如果不提供的参数,我什么也得不到(SomeField = '')。

我想知道:是否有可能在CAML中有参数作为字段值?例如,我知道这是行不通的,但你明白了:

<Where> 
    <Or> 
    <Eq> 
     <FieldRef Name='SomeField'/> 
     <Value Type='Text'>{param}</Value> 
    </Eq> 
    <Eq> 
     <FieldRef Formula='{param}'/> 
     <Value Type='Text'></Value> 
    </Eq> 
    </Or> 
</Where> 

我知道根据CAML模式,似乎不可能。这样,我可以真正实现服务器端过滤。 XSL的替代方案是客户端,这意味着更多的记录将被检索到。

是的,我知道我可以通过编程来实现,但这不是我的意图。我希望使用XsltListViewWebPart。

有什么想法?任何替代品?

+0

除非你想(如你自己所建议的)做一些编码,这些情况可以通过使用计算字段来解决,http://social.msdn.microsoft.com/Forums/sharepoint/en-US/3b5f966d-77e3-4470 -b0df-7a28914287cc/caml-query-using-conditions-on-parameters?forum = sharepointdevelopmentlegacy – 2014-10-05 13:28:45

+0

这些情况不能通过计算字段正确解决,因为我必须为每个列表创建一个空的计算字段,这使得它成为非通用解决方案。我知道你发送的链接,这正是我面临的问题。而使用XSLT过滤只发生在“客户端”,这不利于性能。 – 2014-10-05 20:55:18

+0

那你使用什么webpart?如果您使用CQWP,则可以将RenderOnServer = true添加到查询字符串中或实现AlwaysRenderOnServer(http://msdn.microsoft.com/zh-cn/library/microsoft.office.server.search.webcontrols.contentbysearchwebpart.alwaysrenderonserver.aspx?ocid = aff-n-we-loc - ITPRO40936&WT.mc_id = aff-n-we-loc - ITPRO40936) – 2014-10-06 05:40:46

回答

0

明白了:

<Where> 
    <Or> 
     <Geq> 
      <FieldRef Name='SomeField'/> 
      <Value Type='Number'>{param}</Value> 
     </Geq> 
     <Contains> 
      <FieldRef Name='Author'/> 
      <Value Type='Text'><![CDATA[{param}]]></Value> 
     </Contains> 
    </Or> 
</Where> 

关键是要在第二个条件东西,这将是真实的。在这种情况下,如果未提供{param},它将是'',因此它将被Author(创建者)字段包含,该字段始终不为空。问题是我不得不围绕{param},否则,它将无法工作。