0

大家

好这是我在 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  
}



尝试的东西

  • 清洗溶液
  • 挖掘工作备份并检查代码更改
    (发现没有影响结构或用户控制)

  • 设置 LinkBut​​ton CausesValidation true/false

  • 将 datalist 和 LinkBut​​ton 剥离为基本要素
  • 将 AddressOf="btnX.click" 添加到 LinkBut​​ton

  • 使用围绕用户控件
    数据
    列表链接按钮的不同设置一次包装一个 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);
    }
    

    无论我在哪里添加上面的代码,都会找到所有按钮并附加事件,但单击事件不会触发((LinkBut​​ton) = LinkBut​​ton 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);
    }
4

1 回答 1

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);
}
于 2013-05-13T12:48:10.890 回答