大家好祝这是我在stackoverflow上的第一篇文章(顺便说一句,这是我最喜欢的网站,用于寻找答案)。在最终承认失败之后,我希望有人可以帮我解决这个问题...
已经多次提出这个问题,但我找到的建议解决方案都没有帮助。提前为一篇冗长的帖子道歉,但我想避免任何人浪费时间建议我已经尝试过的事情。
下面的代码直到最近才开始工作,因为它的结构没有被触及(尽管对子页面进行了无关的更改)。无论如何,它突然停止了工作。现在,即使最简化的按钮也不会触发。
设置
的问题
在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
使用不同的设置一次一个地包装UpdatePanel
用户控件
数据列表
链接按钮
在usercontrol init / load事件中重新附加eventhandler:
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里面&lt;&gt ;;无法让它显示正确,仍然在编辑中苦苦挣扎)
在页面加载事件中手动添加PostBackUrl
就是这样。现在,我无法想到还有什么可以尝试或检查(也许在回发的断点上下文菜单中有什么东西?)。
因为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);
}
答案 0 :(得分:2)
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");
这段代码到底在哪里?
您需要确保创建它并在页面生命周期中尽早将其添加到控件集合中,以便在后续回发时创建它并创建它。及时连线。即在oninit事件中。
protected override OnInit(...)
{
base.OnInit(...);
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");
this.Controls.Add(ctrlX);
}