Background:我正在定制现有的ASP.NET/C#应用程序.它有自己的小"框架"和约定,供开发人员在扩展/定制其功能时遵循.我目前正在扩展它的一些管理功能,框架为其提供了一个契约,以强制实现返回System.Web.UI.ControlGetAdministrationInterface()方法.在托管GUI界面的页面的Page_Load()方法期间调用此方法.

Problem:我的GUI中有三个按钮,每个按钮都分配了一个事件处理程序.我的管理GUI加载得非常好,但是单击任何一个按钮都不会执行我期望它们执行的操作.但是,当我再次单击它们时,按钮仍然起作用.

我在每个事件处理程序方法的开头放置了断点,并单步执行了我的代码.第一次单击时,没有触发任何事件处理程序.在第二声咔哒声中,他们开枪了.

有什么主意吗?

Example of Button Definition (within 100)

public override Control GetAdministrationInterface()
{
    // more code...

    Button btn = new Button();
    btn.Text = "Click Me!";
    btn.Click += new EventHandler(Btn_Click);

    // more code...
}

Example of Event Handler Method Definition

void Btn_Click(object sender, EventArgs e)
{
    // Do Something
}

100 Method that calls 101

protected void Page_Load(object sender, System.EventArgs e)
{
    if (!Page.IsAsync)
    {
        List<AdministrationInterface> interfaces = <DATABASE CALL>;
        foreach(AdministrationInteface ai in interfaces)
        {
            placeholderDiv.Controls.Add(ai.GetAdministrationInterface());
        }
    }
}

推荐答案

哎呀!我就知道会有这么愚蠢的事.当然,纯粹是我的错,以及我对ASP.NET知识的缺乏.

在做了大量的谷歌搜索后,最终被怀疑是运行自动脚本的机器人而被谷歌屏蔽,我设法挤进了最后一次搜索,偶然发现了这article个.我已经快要放弃了,我尽最大努力阅读这篇文章,一次不跳过10行,也不寻找漂亮的图片.在标题为Assigning IDs to Dynamically Created Controls的部分中,我读到了这些神奇而快乐的文字:

如果您在单击"不工作"按钮之前和单击它之后查看源HTML,您会注意到细微的差别.这些按钮在回发前后具有不同的HTML ID.我在回发之前获得了ctl04和ctl05,在回发之后获得了ctl02和ctl03.

ASP.NET按钮通过在请求中判断其ID的值来识别事件.表格收集.(事实上,情况不同,控件不判断请求.表单自行收集.页面通过控件的ID将post数据传递给控件,并将post数据传递给注册以获得post数据通知的控件).ASP.NET不会触发Click事件,因为按钮的ID在回发之间发生了更改.您单击的按钮和之后看到的按钮是ASP的不同按钮.网

果然,当我第一次查看HTML时,我的按钮的ID是ctl04$ctl36.点击按钮后,我的按钮的ID为ctl04$ctl33.

好了!我所要做的就是在按钮和按钮上设置ID!现在正在调用我的事件处理程序!

Sample Solution:

public override Control GetAdministrationInterface()
{
    // more code...

    Button btn = new Button();
    btn.Text = "Click Me!";
    // !!THE BANE OF MY EXISTENCE!!
    btn.ID = "The_Bane_of_My_Existence";
    // !!THE BANE OF MY EXISTENCE!!
    btn.Click += new EventHandler(Btn_Click);

    // more code...
}

花两天时间的好方法...

Asp.net相关问答推荐

.net 中的 [] 括号是什么?

如何在 ASP.Net Core 中验证上传的文件

在 Web.Config 的 Location Path 元素中指定多个目录

*不*使用 asp.net 会员提供程序是个坏主意吗?

ASP.Net - App_Data & App_Code 文件夹?

使用实体框架从存储过程中获取数据

在 ASP.NET 中更改错误消息的语言

将 null 转换为字符串的函数

用于链接字符串中的 url 的 C# 代码

如何更改 .ASPX 自动格式化设置 (Visual Studio)

ASP.NET 会话超时测试

ASP.NET MVC Url Route 支持(点)

如何从url中删除returnurl?

ASP.NET MVC 4 的 Windows 身份验证 - 它是如何工作的,如何测试它

HtmlAgilityPack Select 的子 node 不符合预期

为什么在 MVC4 Razor 布局文件中无法识别 @Scripts 和 @Styles 命令?

如何修复 ASP.NET 错误文件 'nnn.aspx' 尚未预编译,无法请求.?

ASP.NET Web 窗体中的 jQuery 验证插件

SignalR 2.0 错误:无法加载文件或程序集 Microsoft.Owin.Security

jQuery Ajax 调用 - 成功设置变量值