2014-10-05 217 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},否則,它將無法工作。