繁体   English   中英

LinkBut​​ton回发但未点击事件

[英]LinkButton postback but click event not fired

嗨,大家好

这是我在stackoverflow上的第一篇文章(顺便说一句,这是我最喜欢的网站,用于寻找答案)。 在最终承认失败之后,我希望有人可以帮我解决这个问题......

这个问题已经被多次提出过,但我找到的建议解决方案都没有提供帮助。 提前为一篇冗长的帖子道歉,但我想避免任何人浪费时间建议我已经尝试过的事情。

下面的代码一直工作到最近,其结构从未被触及(尽管对子页面进行了无关的更改)。 无论如何,它突然停止了工作。 现在即使是最简化的按钮也不会触发。

设定

  • VS 2008 C#,IIS 7(在设置停止工作之前没有设置更改)

  • 嵌套母版页(主要+ 1个孩子)

  • 在子页面中使用datalist动态加载ucl
    (即MP =>嵌套MP =>子页=> ucl => datalist => linkbutton)

  • linkbutton click事件也驻留在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
    用户控件
    数据列表
    LinkBut​​ton的

  • 在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); } 

    无论我在哪里添加上面的代码,都会找到所有按钮并附加事件,但是click事件不会触发((LinkBut​​ton)= LinkBut​​ton里面<>;无法让它显示正确,仍然与编辑器有点挣扎) 。

  • 在页面加载事件中手动添加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);
    }
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");

这些代码到底在哪里?

您需要确保创建它并在页面生命周期中尽早将其添加到控件集合中,以便在随后的回发中及时创建和连接。 即在oninit事件。

protected override OnInit(...)
{
   base.OnInit(...);

   var ctrlX = base.LoadControl("~/somedir/someucl.ascx");

   this.Controls.Add(ctrlX);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM