2009-01-29 6 views
1

I ont un contrôle utilisateur qui a plusieurs panneaux de mise à jourUpdatePanels multiples et de l'état


Sur chargement de la page, je charge un contrôle utilisateur de l'enfant de façon dynamique sur le PlaceHolder (I faire ceci à chaque fois et ne pas vérifier pour la publication)

Je veux être en mesure de maintenir l'état de les modifications qu'un utilisateur effectue dans le contrôle utilisateur enfant. (Le contrôle utilisateur enfant a des contrôles html avec les contrôles asp.net et d'autres contrôles personnalisés).

Le contrôle utilisateur enfant perd l'état chaque fois qu'il y a un clic sur le bouton A ou B qui provoque la publication. Le mode pour UpdatePanels a été défini sur conditionnel.

Dans le OnPageLoad,

  1. je charge un contrôle enfant à la PlaceHolderA
  2. Ce contrôle enfant a un autre contrôle utilisateur avec beaucoup de JS. Un utilisateur peut potentiellement apporter des modifications au contrôle enfant.
  3. Lorsqu'ils cliquent sur le bouton A qui fait partie du contrôle parent, le contrôle OnPageLoad provoque le rechargement du contrôle enfant, ce qui entraîne la perte des modifications côté client effectuées par un utilisateur.

Je voudrais empêcher cela de se produire.

est ici la structure HTML de la page ASPX

<UpdatePanel1> 
<UpdatePanelChild1> 
    <Button A> 
    <Button B> 
</UpdatePanelChild1> 
<UpdatePanelChild2> 
    <PlaceHolderA> 
</UpdatePanelChild2>  

Répondre

0

Blockquote // code dans votre code Asp.Net

<form runat="server" id="form1"> 
      <asp:ScriptManager id="ScriptManager1" runat="server" > 
       <Services> 
        <asp:ServiceReference Path="/WebServices/MyService.asmx"/> 
       </Services> 
      </asp:ScriptManager> 
     </form>  
      <script language="javascript" type="text/javascript"> 
       //call with namespace "WebSite" included 
       WebSite.WebServices.HelloWorld(EndHelloWorld); 


       function EndHelloWorld() 
       { 
        //do whatever 
       } 
      </script>  
    </form> 

Blockquote // code dans votre classe WebService

[ScriptService] 
    public class MyService : System.Web.Services.WebService 
    { 
     [WebMethod] 
     public void HelloWorld() 
     { 
      return "Hello world"; 
     }    
    } 

De le script de ma page je vais faire Ajax contre mon webservice, et le rappel EndHelloWorld vous pourriez faire n'importe quoi sans perdre l'état.

Espérons que ça aide ... Cordialement. Joséma.

0

Il semble que vous deviez supprimer les UpdatePanels imbriqués. Dans une structure comme celle-ci:

<ParentUpdatePanel> 
    <ChildUpdatePanel1 /> 
    <ChildUpdatePanel2 /> 
</ParentUpdatePanel /> 

tous les panneaux de mise à jour mettra à jour toujours, même si les UpdatePanels enfants sont mis à condition, parce que le parent est en fait celle qui est mise à jour. Ainsi, un événement de publication dans l'un des enfants provoquera la mise à jour du parent.

avec ce type de modèle est mauvais en général ... si vous avez besoin des événements d'un UpdatePanel pour provoquer des mises à jour dans une autre, vous devriez faire ceci:

<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
    <asp:Button ID="buttonA" runat="server" /> 
    <asp:Button ID="buttonB" runat="server" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 
<asp:UpdatePanel ID="up2" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
    <asp:Placeholder ID="ph" runat="server" /> 
    </ContentTemplate> 
    <Triggers> 
    <asp:AsyncPostBackTrigger ControlID="buttonB" EventName="Click" /> 
    </Triggers> 
</asp:UpdatePanel> 
1

Lorsque vous ajoutez dynamiquement des contrôles, vous devez la ajoutez-les chaque fois que votre page se charge. J'ai dû faire face à des difficultés similaires et je le fais de deux manières. Lorsque des champs dynamiques sont ajoutés à la volée, j'ajouterai un contrôle caché à la page avant que l'utilisateur ne clique pour le remplir ou l'ajouter lui-même. En créant ce type d'espace réservé, le système a commencé à gérer viewstate correctement, ce qui préserve les modifications de l'utilisateur. Le deuxième problème que je vous entends mentionner est qu'il pourrait y avoir des problèmes avec les mises à jour du panneau de mise à jour chich. Il est bon de les mettre à condition que votre code-behind, vous pouvez également déclencher les mises à jour dans les autres paniers si vous avez besoin de code. C'est juste updatepanel # .update()

alternativement vous pouvez également envelopper tous les panneaux de mise à jour dans un autre panneau mais je déconseille cela car cela gaspille des ressources.

1

Il semble que vous perdiez ViewState pour votre contrôle enfant ajouté dynamiquement. Ceci est dû au fait que vous l'ajoutez trop tard dans le cycle de vie de la page: le ViewState est chargé avant l'événement Page.Load.

Essayez plutôt d'ajouter votre contrôle enfant dans Page.Init.