大家
好这是我在 stackoverflow 上的第一篇文章(顺便说一句,这是迄今为止我最喜欢的寻找答案的网站)。终于承认失败后,我希望有人能帮助我解决这个问题......
这个问题已经被问过好几次了,但我找到的建议的解决方案都没有帮助。提前为一篇冗长的帖子道歉,但我想避免任何人浪费时间建议我已经尝试过的事情。
下面的代码直到最近才起作用,并且它的结构从那时起就没有被触及(尽管对子页面进行了不相关的更改)。无论如何,它突然停止工作。现在,即使是最简化的按钮也不会触发。
设置
- VS 2008 C#,IIS 7(在停止工作之前没有更改设置)
- 嵌套母版页(主 + 1 个子页)
- 在子页面中使用 datalist 动态加载 ucl
(即 MP => 嵌套 MP => 子页面 => ucl => datalist => 链接按钮)
- 链接按钮单击事件也驻留在 ucl 中
问题
在 LB 点击时,回发正常,但服务器端点击事件永远不会被命中。
代码
页:
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");
=> loads fine
ascx 文件(数据列表除按钮之外的所有内容):
<asp:DataList ID="dlX" RepeatLayout="Table" runat="server">
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:LinkButton ID="btnX" OnClick="btnX_Click" CausesValidation="false" runat="server" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate></FooterTemplate>
代码隐藏:
protected void btnX_Click(object sender, EventArgs e)
{
// do something
}
尝试的东西
- 清洗溶液
挖掘工作备份并检查代码更改
(发现没有影响结构或用户控制)设置 LinkButton CausesValidation true/false
- 将 datalist 和 LinkButton 剥离为基本要素
- 将 AddressOf="btnX.click" 添加到 LinkButton
使用围绕用户控件
数据
列表链接按钮的不同设置一次包装一个 UpdatePanel在用户控件初始化/加载事件中重新附加事件处理程序:
IEnumerable<Control> controls = Utils.FlattenChildren(dlX); foreach (var button in controls.OfType(LinkButton)()) { if (button.ID.Contains("btnX")) button.Click += new EventHandler(btnX_Click); }
无论我在哪里添加上面的代码,都会找到所有按钮并附加事件,但单击事件不会触发((LinkButton) = LinkButton inside <>; 无法正确显示,仍然在编辑器中挣扎) .
在页面加载事件中手动添加 PostBackUrl
- 比较加载/回发事件之间的客户端 ID => 它们始终匹配
而已。现在,我想不出还有什么可以尝试或检查的(也许在回发的断点上下文菜单中?)。
因为 ucl 加载正常,并且回发工作正常,我怀疑问题出在 ucl 的某个地方,而不是加载它的子页面。但也许不是。
如果可能的话,我想避免变通办法(我需要按钮命令参数,上面没有显示,并且不热衷于诸如带有隐藏字段或查询字符串的 jquery 之类的解决方案)。
除此之外,我真的很想了解导致这种情况的原因。
显然,我错过了一些东西......感谢任何花时间阅读/帮助的人!
======== 应要求附加代码隐藏 =======
我已将父页面代码简化到最低限度,删除所有方法调用,并根据 Eoins 的建议将 ucl 加载移动到页面的 init 事件中. ucl 代码仍然如上所示。DL 和 LB 显示正常,点击后触发回发,触发 ucl 页面加载事件,但和以前一样,未触发服务器点击事件。
protected override void OnInit(EventArgs e)
{
var ctrlX = base.LoadControl("~/someucl.ascx");
if (ctrlX == null)
return;
DataList dlX = (DataList)ctrlX.FindControl("dlX");
if (dlX == null)
return;
DummyCollection x = new DummyCollection();
x.Add(null); // ok since the test LB does not draw on the datasource
dlX.DataSource = x;
dlX.DataBind();
pnlX.Controls.Add(ctrlX);
base.OnInit(e);
}