2010-09-13 2 views
1

Ma page contient un répéteur chargé de données de manière asynchrone au fur et à mesure que les données deviennent disponibles, en utilisant un UpdatePanel pour gérer les requêtes asynchrones.ASP.net - LinkButtons dans un répéteur dans un UpdatePanel ne déclenche aucune publication

La page contient quelque chose d'un peu comme ceci:

<asp:UpdatePanel ID="DataUpdatePanel" runat="server"> 
<ContentTemplate> 
<table> 
    <asp:Repeater ID="RepeaterBlock" runat="server"> 
    <HeaderTemplate><thead><tr><th>Name</th><th>Status</th><th class="empty"></th></tr></thead></HeaderTemplate> 
    <ItemTemplate><tr> 
     <td><a class="link" href="Detail.aspx?item=<%# DataBinder.Eval(Container.DataItem, "Name") %>"><%# DataBinder.Eval(Container.DataItem, "Name") %></a> 
     </td> 
     <td><%# DataBinder.Eval(Container.DataItem, "Status") %></td> 
     <td class="no-border"> 
      [<asp:LinkButton CommandName='Schedule' CommandArgument='<%# DataBinder.Eval(Container.DataItem, "Name") %>' ID="ScheduleButton" runat="server" CausesValidation="false" >Schedule</asp:LinkButton>] 
     </td> 
    </tr></ItemTemplate> 
    </asp:Repeater> 
</table> 
</ContentTemplate> 
</asp:UpdatePanel> 

Le problème étant que le LinkButton ne semble pas déclencher une publication de tout kind- il n'y a pas de réponse visible en cliquant sur et mettre une pause point sur l'écouteur d'événement dans le codebehind, il n'est jamais déclenché.

J'ai essayé d'ajouter manuellement un déclencheur comme celui-ci:

<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="ScheduleButton" /> 
</Triggers> 

Mais malheureusement becausee les contrôles sont dans le ContentTemplate il se bloque si je tente de le faire.

Une autre avenue que j'ai exploré est de les ajouter explicitement dans le code-behind:

RepeatData.DataBind(); 
    RepeatData.ItemCommand += new RepeaterCommandEventHandler(RepeatData_ItemCommand); 

    UpdateScripts.RegisterAsyncPostBackControl(FindControlRecursive(RepeatData, "SchedulButton")); 

La méthode FindControlRecursive se comporte comme FindControl seulement il fait trouve des contrôles.

Cela ne plante pas, mais cela n'entraîne pas l'activation des LinkButtons. Est-ce que quelqu'un peut suggérer ce que je dois faire pour les obliger à poster comme je le demande?

Edit: À l'origine, j'avais cette page qui fonctionnait sans le UpdatePanel et cela fonctionnait bien, avec plus de données, il a commencé à expirer, donc j'avais besoin d'obtenir les données de manière asynchrone. C'est quand j'ai fait ce changement que les linkbuttons ont cessé de fonctionner.

+0

quel événement a un gestionnaire inscrit? Je ne vois aucun spécifié dans votre balisage. – lincolnk

+0

Ce n'est pas dans le balisage - c'est pourquoi je l'ajoute au Répéteur dans la deuxième ligne de l'extrait de CodeBehind là. – glenatron

Répondre

1

Vous devez enregistrer tous vos boutons de lien sur OnCommand avec un gestionnaire d'événements côté serveur pour utiliser les propriétés CommandName/CommandArg.

[<asp:LinkButton CommandName='Schedule' CommandArgument='<%# DataBinder.Eval(Container.DataItem, "Name") %>' ID="ScheduleButton" runat="server" CausesValidation="false" OnCommand="LinkButtonCommandEventHandler" >Schedule</asp:LinkButton>] 

référence Voir msdn:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.linkbutton.commandname.aspx

+0

J'utilise ItemCommand pour le répéteur dans son ensemble plutôt que de travailler sur un bouton par bouton: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemcommand .aspx – glenatron

+0

Gotcha, votre événement Page_Load est-il touché par les clics du bouton de lien? Cela change-t-il quelque chose si vous enregistrez l'événement OnCommand, ALORS databind? – asawyer

+0

Aucune différence ne modifiant l'ordre de reliure. Il semble que les linkbuttons ne font rien quand je les clique. Je suppose que la prochaine étape pourrait être de passer par le JavaScript, mais même si je trouve la cause du problème là-bas, je ne suis pas sûr de savoir comment je vais l'ajuster. – glenatron

0

Vous devez soit <asp:Repeater ID="RepeaterBlock" runat="server" OnItemCommand="RepeaterData_ItemCommand">

ou RepeatData.ItemCommand += new RepeaterCommandEventHandler(RepeatData_ItemCommand); dans chaque postback avant RepeatData.DataBind();

+0

J'ai essayé de changer l'ordre du code ci-dessus (vous aurez remarqué que j'ai la deuxième ligne dans mon dernier extrait ci-dessus) pour mettre le eventhandler avant le databind et cela n'a fait aucune différence. – glenatron

Questions connexes