UpdatePanel会导致完整的Postback而不是异步Postback

8
我遇到了一个似乎很常见的问题:我的UpdatePanel触发了完整的PostBack而不是异步PostBack。通常的解决方案是为你动态添加的所有控件分配一个ID,我已经做到了,但我仍然得到了完整的PostBack而不是我的异步PostBack...
以下是代码:
HTML:
<asp:UpdatePanel ID="ItemsUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
   <Triggers>
   </Triggers>    
   <ContentTemplate>
   <asp:ListView ID="PlayerItems" runat="server" GroupItemCount="5" 
                                    onitemdatabound="PlayerItems_ItemDataBound">
   <LayoutTemplate>

   ... Listview stuff ...

    </asp:ListView> 

    </ContentTemplate>
</asp:UpdatePanel>

有趣的部分是 C# 代码(方法 PlayerItems_ItemDataBound)的后面,如下所示:
            ImageButton imgBtn = new ImageButton();
            imgBtn.ID = "itemBtn";
            imgBtn.Width = Unit.Pixel(30);
            imgBtn.ImageUrl = "~/Images/Game/Items/" + myItem.ItemImageUrl;

            ContextMenu menu = new ContextMenu();
            menu.BoundControls.Add(imgBtn);
            menu.ItemCommand += new CommandEventHandler(menu_ItemCommand);

            menu.AutoHide = true;
            menu.RolloverColor = Color.Gray;
            menu.ID = "MenuMenu";

            Panel panel = (Panel)(e.Item.FindControl("ItemPanel"));
            panel.Controls.Add(imgBtn);
            panel.Controls.Add(menu);

            AsyncPostBackTrigger trig = new AsyncPostBackTrigger();
            trig.ControlID = menu.UniqueID;
            trig.EventName = "ItemCommand";
            ItemsUpdatePanel.Triggers.Add(trig);

所以,我实际上向菜单添加了AsyncPostBackTrigger,因此应该注册ItemCommand事件。在此上下文菜单中单击项目时会发生完整的回发。

我一直在尝试使用ChildrenAsTriggers属性进行调整,但没有帮助。我还尝试将AsyncPostBackTrigger代码上下移动,也没有帮助。

先提前感谢您..! Lars

2个回答

31

我在 UpdatePanel 中的 ListView 内部的 Panel 中填充 CheckBoxList 时,也遇到了同样的问题。通过在 CheckBoxList 中添加以下代码,问题得以解决:

ClientIDMode="AutoID" 

5
这很有效!非常感谢。微软在.NET 4.0中更改了ClientID的生成方式,从“AutoID”变为“可预测”,我猜ScriptManager或UpdatePanel没有正确更新以使用它。我无法在任何地方找到关于这个问题的文档,也不知道这是否是有意为之。 - MikeTeeVee
3
史诗级的回答,如此简单。谢谢! - Joe Stellato
2
我不喜欢这个解决方案,但它起作用了!谢谢! - Josh M.
1
我已经在全局上启用了AutoID,但我只需要在我的ListView中的LinkButton上添加ID即可。不需要触发器。 - Chris
即使将ClientID全局设置为静态,将我的RadioButtonLists和CheckBoxLists设置为AutoID仍然是解决方案。 - Dubs

8

嗯...不是我所希望的,但这就是实际情况!非常感谢!我真的很感激! :-) - Lars Holdgaard
非常感谢您,我自己都想打自己!UpdatePanel1.Update(); - GPMorgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接