【问题标题】:ASP.net - LinkButtons in a Repeater within an UpdatePanel are not triggering a postback of any kindASP.net - UpdatePanel 中中继器中的链接按钮不会触发任何类型的回发
【发布时间】:2010-09-13 14:16:51
【问题描述】:

我的页面包含一个Repeater,它在数据可用时异步加载数据,使用UpdatePanel 来管理异步请求。

该页面包含一些类似这样的内容:

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

问题在于 LinkBut​​ton 似乎不会触发任何类型的回发 - 单击它并在代码隐藏中的事件侦听器上放置一个断点没有可见的响应,它永远不会被触发。

我尝试过像这样手动添加触发器:

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

但不幸的是,因为控件在 ContentTemplate 中,如果我尝试这样做,它就会崩溃。

我探索的另一个途径是在代码隐藏中显式添加它们:

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

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

FindControlRecursive 方法的行为与 FindControl 类似,只是它实际上查找控件。

这不会崩溃,但也不会导致 LinkBut​​tons 生效。

谁能建议我需要做什么才能让他们按照我的预期回复?

编辑:最初我让这个页面在没有 UpdatePanel 的情况下工作,它工作得很好,随着更多数据开始超时,所以我需要异步获取数据。正是在我进行此更改时,链接按钮停止工作。

【问题讨论】:

  • 处理程序注册了什么事件?我没有在您的标记中看到任何指定。
  • 它不在标记中 - 这就是为什么我将它添加到来自 CodeBehind 的 sn-p 第二行的中继器中。

标签: c# asp.net ajax


【解决方案1】:

您需要使用服务器端事件处理程序将所有链接按钮注册到 OnCommand 以使用 CommandName / CommandArg 属性。

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

查看msdn参考:

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

【讨论】:

  • 我将 ItemCommand 用于整个 Repeater,而不是逐个按钮地工作:msdn.microsoft.com/en-us/library/…
  • 知道了,您的 Page_Load 事件是否在链接按钮点击时受到打击?如果您注册 OnCommand 事件 THEN databind,它会改变什么吗?
  • 更改绑定顺序没有区别。当我单击它们时,链接按钮似乎什么也没做。我想下一步可​​能是单步执行 JavaScript,但即使我在那里找到问题的原因,我也不确定我将如何调整它。
  • Page_Load 没有被点击?
  • 啊,Page_Load 被击中,但如果它不是回发,我只是在初始化事件处理程序。显然,当它是同步的时候它工作正常,但现在不行了。您不必重新初始化转发器中的数据,但您必须再次添加事件处理程序。保持一致,微软。
【解决方案2】:

你需要&lt;asp:Repeater ID="RepeaterBlock" runat="server" OnItemCommand="RepeaterData_ItemCommand"&gt;

或RepeatData.ItemCommand += new RepeaterCommandEventHandler(RepeatData_ItemCommand); 在RepeatData.DataBind(); 之前的每个回发中

【讨论】:

  • 我尝试改变上面代码的顺序(你会注意到我在上面的最后一个 sn-p 中有第二行)将事件处理程序放在数据绑定之前,它没有任何区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多