2010-03-23 3 views
1

Ai déchiré mon écoute avec celui-ci. Voyons si je peux expliquer:UpdatePanel, JavaScript postback et en changeant querystring en même temps dans la recherche SharePoint Page

J'ai une page de résultats SharePoint sur laquelle j'ai une partie Web de base de résultats de recherche. Maintenant, je veux changer le paramètre dans la chaîne de requête lorsque je publie la page afin que WebPart renvoie des résultats différents pour chaque paramètre, par exemple. le querystring sera interactivemap.aspx? k = Pays: Roumanie ceci filtrera les résultats pour la Roumanie.

Le premier numéro est que je veux faire avec javascript pour que je l'appelle:

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

Rien de spécial ici, mais la raison pour laquelle je dois appeler de Javascript est il y a aussi un applet flash sur cette page à partir de laquelle la Les appels Javascript sont originaires. Lorsque les appels javascript sont effectués, la page doit PostBack mais pas recharger l'applet flash.

Je me suis tourné vers ASP.Net AJAX pour cela, donc j'ai enveloppé le webpart des résultats de recherche dans un panneau de mise à jour. Maintenant si j'utilise un bouton dans le UpdatePanel pour publier le UpdatePanel se comporte comme prévu et fait un rendu partiel des résultats de recherche webpart ne rechargeant pas l'applet flash.

Le problème vient du fait que j'ai besoin de publier la page depuis javscript. J'ai appelé __doPostBack() car j'ai utilisé ce successully dans le passé. Cela marche tout seul mais échoue quand j'appelle le Javascript ci-dessus avant le __doPostBack() (j'ai aussi essayé d'appeler click() sur un bouton caché) le code de la page est en bas.

Je pense que le problème vient avec le scriptmanager qui n'autorise pas un rendu partiel lorsque l'action post-formulaire a changé.

Mes questions sont. A) Y a-t-il un autre moyen de modifier le paramètre webpart des résultats de recherche sans utiliser la chaîne de requête.

ou

B) Y at-il un moyen de contourner la modification du querystring lorsque vous faites un postback AJAX et d'obtenir un rendu partiel.

<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> 

Répondre

1

Je suggère de se débarrasser du UpdatePanel. Un bien meilleur moyen serait d'utiliser "bon" ajax par exemple. avec jQuery et mettez à jour vos données de composants Web en fonction des données récupérées.

Comme vous l'avez remarqué, le UpdatePanel est généralement juste une implémentation rapide qui a ses limites. Cependant, je ne peux pas penser à une bonne raison de justifier les frais généraux qu'il vient avec.

Michael

+0

+1, pour la déclaration 'une bien meilleure serait d'utiliser "bon" ajax par exemple avec jQuery' :-) –

+0

Hehe merci. Il y a encore beaucoup de personnes qui croient que la solution MS UpdatePanel est AJAX appropriée. –

+1

Ce serait une bien meilleure façon de ne pas essayer d'utiliser des composants SharePoint. SharePoint aime le panneau de mise à jour, et essayer de combattre la façon dont SharePoint fait les choses est une très mauvaise idée. –

1

Les résultats de la recherche web partie accepte également les requêtes sous une forme affichée - la boîte de recherche avancée ne définit pas la chaîne de requête.

Vous pouvez trouver les noms de champs pertinents sur mon blog - http://tqcblog.com/2007/10/26/creating-a-custom-advanced-search-box-in-moss-2007/

En utilisant cette approche, vous devriez être en mesure de revenir à votre test initial de l'aide d'un bouton dans le panneau de mise à jour. Vous pouvez même être en mesure d'utiliser la boîte de recherche avancée standard (avec la plupart des champs désactivés) dans le panneau de mise à jour.Rappelez-vous que les champs affichés et les contrôles rendus sont à peu près la même chose, et que le type de contrôle n'a pas d'importance - vous pouvez ajouter l'une des zones de texte du champ de recherche avancée comme champ caché, dans la mise à jour panneau avec votre bouton. De cette façon, il s'agit simplement d'un formulaire standard dans un panneau de mise à jour.

0

Cela se rapproche d'une réponse pour moi, mais votre article n'a pas spécifié les champs affichés seulement les champs que la partie Web de recherche avancée rend. Je n'utilise aucun champ de saisie pour spécifier la requête juste un appel javascript.

J'ai essayé d'utiliser le code suivant qui me rapproche mais le problème est que tout fonctionne mais ne rendra pas un rendu partiel lorsque le JS est appelé. Je ne sais pas pourquoi, car je spécifie le eventTarget comme un ID de bouton qui est un enfant de l'updatepanel.

Im en utilisant:

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

Cela devrait probablement être un commentaire plutôt qu'une réponse - j'ai édité ma réponse originale pour clarifier. –

+0

Ok, je vois ce que vous dites et je pourrais avoir à utiliser si je ne peux pas savoir pourquoi ma solution ne fonctionne pas. Je suis très intrigué par la raison pour laquelle le rendu partiel ne se produit pas avec le code ci-dessus. Je sais que eventTarget a raison, mais il semble que parce que l'action de publication a changé pour inclure une chaîne de requête, cela empêche le rendu partiel de se produire. Quelqu'un peut-il expliquer pourquoi? –