代码之家  ›  专栏  ›  技术社区  ›  glenatron

ASP.NET-UpdatePanel中继器中的LinkButtons未触发任何类型的回发

  •  1
  • glenatron  · 技术社区  · 15 年前

    “我的页面”包含一个中继器,当数据可用时,该中继器将异步加载数据,并使用更新面板来管理异步请求。

    页面包含如下内容:

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

    问题在于,LinkButton似乎不会触发任何类型的回发——单击它并在codebehind中的事件侦听器上放置断点时没有可见的响应,它永远不会被触发。

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

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

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

    我探索的另一种方法是将它们显式地添加到codebehind中:

      RepeatData.DataBind();
      RepeatData.ItemCommand += new RepeaterCommandEventHandler(RepeatData_ItemCommand);
    
      UpdateScripts.RegisterAsyncPostBackControl(FindControlRecursive( RepeatData, "SchedulButton"));
    

    findcontrolRecursive方法的行为就像findcontrol,实际上只有findcontrol 查找控件。

    这不会崩溃,但也不会导致链接按钮变得有效。

    有人能提出我需要做什么才能让他们按我期望的那样回发邮件吗?

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   asawyer    15 年前

    要使用commandname/commandarg属性,需要使用服务器端事件处理程序注册oncommand的所有链接按钮。

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

        2
  •  0
  •   Musa Hafalir    15 年前

    你也需要 <asp:Repeater ID="RepeaterBlock" runat="server" OnItemCommand="RepeaterData_ItemCommand">

    RepeatData.ItemCommand += new RepeaterCommandEventHandler(RepeatData_ItemCommand); 在每次回发之前 RepeatData.DataBind();