【发布时间】:2018-11-08 08:22:28
【问题描述】:
我有一个 UserControl,我们称之为 ButtonPanel,它只是面板 (id="bPanel") 中的一个按钮 (id="btn"),以及一个文字(id="msg")。按钮的单击事件绑定到按钮的 ASPX 标记中的事件处理程序 ("btn_Click")。处理程序只需将“Button Pressed”放入上述“msg”字面量中。
在我的主页中,如果我将 ButtonPanel 拖到页面中而不是动态创建它,那么当在控件中触发事件时,就会显示消息。一切正常。
但是,如果我在主页的 Page_Init() 函数中动态创建 ButtonPanel 并将其添加到页面上的容器中,那么 btn_Click 控件中的事件处理程序永远不会被调用。用户控件的 Page_Load() 和 Page_Init() 函数都由 PostBack 调用,但此后不会调用 UserControl 中的事件处理程序。
有人会认为“btn”的 id 会包含在回发数据中,但我无法在 Request.Params 中找到它。如果我能弄清楚用户控件中的哪个控件涉及到,以及涉及到什么事件,我不介意自己调度事件。毕竟不是所有东西都是一个按钮和一个点击事件。
我一直在网上搜索,当然我不是第一个遇到这个问题的人。到目前为止,我还没有找到任何好的解决方案。
如果有来自 Microsoft 的人正在阅读这篇文章...WTF? ASP.NET 已经存在了多少年了?快20了,我想?这从根本上破坏了用户控件的实用性,那么您为什么不解决它呢?
编辑:添加了后续 cmets 的一些细节。
【问题讨论】:
-
很高兴看到您目前所获得的一些代码。您是否将动态创建的按钮链接到您制作的点击功能?
btn.Click += btn_Click之类的东西? -
正如@ikerbera 提到的,您需要附加事件。并确保触发事件的按钮或控件仍然存在于 PostBack 中,否则它不起作用。所以在添加控件时不要使用
IsPostBack检查。 -
在用户控件中,btn_click 事件处理程序绑定到按钮的 ASPX 标记中的控件:在用户控件中,没有动态创建任何内容。
-
在主页面中,用户控件是在 Page_Init 函数中动态创建并添加到页面中的。 IsPostBack 没有测试。当用户控件中的按钮被按下时,用户控件的 Page_Load 处理程序被调用,因此系统清楚地知道发生了一些事件,但没有调用事件处理程序,并且 Request.Params 的转储未能找到任何证据表明按钮的 ID 已从客户端发送。