2010-03-23 44 views
1

一直在撕掉我聽到的這一個。讓我看看是否可以解釋:UpdatePanel,JavaScript回發和在SharePoint搜索頁面同時更改查詢字符串

我有一個SharePoint結果頁,其中有一個Search Results Core WebPart。現在,我想在回發頁面時更改查詢字符串中的參數,以便WebPart爲每個參數返回不同的結果,例如查詢字符串將爲interactivemap.aspx?k =國家:羅馬尼亞,這將過濾羅馬尼亞的結果。

第一個問題是我想用JavaScript來做到這一點,所以我呼籲:

document.getElementById('aspnetForm').action = "interactivemap.aspx?k=Country:" + country; 

這裏沒有什麼特別,但我需要從JavaScript調用的原因也有此頁面上的閃光小程序從中Javascript調用發起。當進行javascript調用時,頁面需要PostBack,但不能重新加載Flash小程序。

我轉向ASP.Net AJAX爲此,我將搜索結果webpart包裝在更新面板中。現在,如果我使用UpdatePanel中的按鈕來回發UpdatePanel的行爲,並且執行搜索結果webpart的部分呈現不會重新加載Flash小程序。

問題出現是因爲我需要從javscript回發頁面。我稱之爲__doPostBack(),因爲我過去曾經使用過這種方法。它在它自己的工作,但在我__doPostBack()之前第一次調用上述Javascript時失敗(我也嘗試在隱藏按鈕上調用click()),頁面的代碼位於底部。

我認爲這個問題伴隨着scriptmanager在表單發佈操作發生變化時不允許部分呈現。

我的問題是。

A)有沒有其他方法可以在不使用查詢字符串的情況下更改搜索結果webpart參數。

B)是否有周圍做一個AJAX回發時改變查詢字符串,並得到一個局部渲染的方式。

<asp:content contentplaceholderid="PlaceHolderFullContent" runat="server"> 
      <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" /> 
      <SPSWC:pagelevelerror runat="server" id="PageLevelError"/> 
      <script type="text/javascript"> 
       function update(country) { 
        //__doPostBack('ContentUpdatePanel', ''); 
        //document.getElementById('aspnetForm').action = "interactivemap.aspx?k=ArticleCountry:" + country; 
        document.getElementById('ctl00_PlaceHolderFullContent_UpdateButton').click(); 
       } 
      </script> 
      <div id="flashFeature"> 
      <object type="application/x-shockwave-flash" data="_layouts/HFT/flashApplets/interactiveMap/interactiveMap/interactiveMapAssets/IMap.swf" width="100%" height="500px" id="flashContent" style="visibility: visible;"> 
        <param name="bgcolor" value="#cccccc"><param name="allowfullscreen" value="true"> 
        <param name="allowscriptaccess" value="always"> 
        <param name="flashvars" value="ASSETS_FOLDER=_layouts/HFT/flashApplets/interactiveMap/interactiveMap/interactiveMapAssets/"> 
        <param name="movie" value="_layouts/HFT/flashApplets/interactiveMap/interactiveMap/interactiveMapAssets/IMap.swf"> 
        <embed src="_layouts/HFT/flashApplets/interactiveMap/interactiveMap/interactiveMapAssets/IMap.swf" width="100%" height="500px"></embed></object> 
      </div> 
      <div onclick="update('Romania');">Romania</div> 
      <div class="firstDataTitle"> 
      <div class="datatabletitleOuterWrapper"> 
       <div class="datatabletitle"> 
        <span>Content</span></div> 
      </div> 
      <div class="datatableWrapper"> 
       <div class="dataHolderWrapper"> 
        <div class="datatable"> 
         <div> 
          <div class="searchMain">   
           <div class="searchZoneMain"> 
           <asp:UpdatePanel runat="server" id="ContentUpdatePanel" UpdateMode="Conditional">        
           <ContentTemplate> 
            <WebPartPages:webpartzone runat="server" AllowPersonalization="false" title=" <%$Resources:sps,LayoutPageZone_BottomZone%>" id="BottomZone" orientation="Vertical" QuickAdd-GroupNames="Search" QuickAdd-ShowListsAndLibraries="false"><ZoneTemplate> </ZoneTemplate></WebPartPages:webpartzone> 
            <asp:Button id="UpdateButton" name="UpdateButton" runat="server" Text="Update"/> 
            </ContentTemplate> 
           </asp:UpdatePanel> 
           </div> 
          </div>  
         </div>       
       </div>       
      </div> 
     </div> 
     </div> 
    </asp:content> 

回答

1

我建議擺脫UpdatePanel。一個更好的方法是使用「合適的」ajax,例如與jQuery和基於檢索到的數據更新您的Web部件數據。

正如你已經注意到UpdatedPanel通常只是一個快速實現,已經有了它的侷限性。但是,我想不出一個很好的理由來證明它帶來的開銷。

邁克爾

+0

+1,該語句'一個更好的方法是使用「正確」的AJAX例如與jQuery' :-) – 2010-03-23 22:10:36

+0

呵呵謝謝。仍然有很多人認爲MS UpdatePanel解決方案是合適的AJAX。 – 2010-03-24 01:23:32

+1

如果不嘗試使用SharePoint組件,那將是更好的方法。 SharePoint喜歡更新面板,並試圖與SharePoint做事情的方式鬥爭是一個非常糟糕的主意。 – 2010-03-24 06:10:21

1

搜索結果Web部件也接受以提交的表單查詢 - 先進的搜索框不設置查詢字符串。

你可以找到我的博客相關的字段名稱 - http://tqcblog.com/2007/10/26/creating-a-custom-advanced-search-box-in-moss-2007/

使用這種方法,你應該能夠恢復到原來的使用更新面板之內的按鈕的測試。您甚至可以在更新面板中使用標準的高級搜索框(關閉大多數字段)。

請記住,發佈的字段和呈現的控件幾乎是一回事,控件的類型並不重要 - 您可以將高級搜索框中的一個文本框添加爲更新內的隱藏字段與您的按鈕面板。這樣它就是更新面板中的標準表單。

0

這對我來說接近答案,但是您的文章沒有指定發佈的字段只是高級搜索Web部件呈現的字段。我沒有使用任何輸入字段來指定查詢只是一個JavaScript調用。

我嘗試使用下面的代碼讓我更接近,但問題是它的一切工作,但不會在調用JS時做部分渲染。我不知道爲什麼,因爲我將eventTarget指定爲一個按鈕ID,它是updatepanel的子項。

即時通訊使用:

WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$PlaceHolderFullContent$UpdateButton", "", false, "", "interactivemap.aspx?k=ArticleCountry:" + country, false, true)); 
+0

這應該可能是一個評論而不是答案 - 我編輯了我的原始答案以澄清。 – 2010-03-24 22:17:38

+0

好的,如果我找不到解決方案無法正常工作的原因,我會看看您的說法和我可能必須使用的內容。 我非常想知道爲什麼局部渲染不會發生在上面的代碼中。我知道eventTarget是正確的,但似乎是因爲後動作已經改變,包括查詢字符串它停止發生部分渲染。誰能解釋爲什麼? – 2010-03-27 10:07:28