2010-05-04 52 views
33

背景之后的第二点击:我自定义现有的ASP .NET/C#应用程序。它具有它自己的一些“框架”和约定,供开发人员在扩展/定制其功能时遵循。我目前正在扩展它的一些管理功能,框架提供了一个合同来强制执行GetAdministrationInterface()方法,该方法返回System.Web.UI.Control。在承载GUI界面的页面的Page_Load()方法期间调用此方法。ASP .NET按钮事件处理不火的第一次点击,但回发

问题:我在我的GUI中有三个按钮,每个按钮都被分配了一个事件处理程序。我的管理GUI加载完全正常,但点击任何按钮都不能达到我期望的效果。但是,当我再次点击它们时,按钮就起作用了。

我在每个事件处理程序方法的开始处放置了断点并遍历了我的代码。在第一次点击时,没有任何事件处理程序被触发。在第二次点击时,他们解雇了。

任何想法?按钮定义的

实施例(内GetAdministrationInterface)事件处理方法定义的

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

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

    // more code... 
} 

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

Page_Load方法调用GetAdministrationInterface

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()); 
     } 
    } 
} 
+1

你在哪里把你的按钮定义和事件处理程序的条件检查来避免这种

的一种方式?如何将按钮添加到页面? – 2010-05-04 13:51:26

+0

发布调用'GetAdminInterface'并构建控件的Page_Load代码 – 2010-05-04 13:54:28

+0

我将“Page_Load”代码添加到了原始问题中。 – John 2010-05-06 17:19:50

回答

62

天哪!我知道这将是一件愚蠢的事情。纯粹是我的错,当然还有我在ASP .NET中缺乏知识。

在做了大量Google搜索并最终被Google封锁后,我怀疑它是一个运行自动化脚本的bot,于是我设法在最后一次搜索中找到并偶然发现了这个article。已经放弃的时候,我尽力阅读这篇文章,一次没有跳过10行,或者寻找漂亮的图片。在标题为部分分配ID来动态创建的控件,我读了这些神奇的,最快乐的话:

如果您单击不工作的按钮,你点击它,你前后查看HTML源会注意到一个小的差异。在回发之前和之后,按钮具有不同的HTML ID。我在回前后得到了ctl04和ctl05,在后回后得到了ctl02和ctl03。

ASP.NET按钮通过在Request.Form集合中检查其ID的值来识别事件。 (实际上它发生的方式不同,控件不会自己检查Request.Form集合,页面将邮递数据传递给控件的ID和控件,这些控件被注册为通知邮局数据)。 ASP。NET不会触发Click事件,因为按钮的ID在后发之间发生了变化。您单击的按钮和您看到的按钮是ASP.NET的不同按钮。

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

所以你有它!我所需要做的就是在按钮上设置ID并快速启动!我的事件处理程序正在被调用!

样品溶液:

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... 
} 

真是一个伟大的方式来花两天时间...

+1

做得好,很好地解释。这是问题的答案,你已经保存了我的培根。 – 2011-08-17 23:00:51

+0

伟大的工作,我在过去15天努力解决同样的问题。伟大的文章 – Moons 2011-12-13 06:45:31

+0

真棒!这篇文章正是我正在寻找的(几个小时)。谢谢! – SunfiShie 2011-12-14 17:05:30

0

虽然它很难确切地知道,没有看到它闻起来像的事件处理程序一点点,直到重新加载页面不挂钩充分Page_Load方法。

如:

if (IsPostBack) { 
    // Add handlers here ... 
} 
1

我面临同样的问题。我的第一次点击后,我的按钮冻结了。对我来说,当我禁用按钮的EnableViewState属性时,这个烦人的问题就解决了。

15

我有同样的问题,但这里接受的答案并没有导致它。我有一个文本框和一个搜索按钮,并且第一次点击按钮没有执行搜索。该按钮的事件处理程序未被击中。但第二次点击按钮确实触发了服务器上的事件。这是为什么:

如果您有其AutoPostBack设置<asp:Textbox>true,在文本框中输入,然后移动点击一个按钮后,该文本框立即引起后背部就失去焦点的时刻。因此,即使按钮的点击也不计数(由于文本框的事件,页面已经被返回)。这就是为什么当你第二次点击该按钮时,它会起作用,因为该文本框没有被包含在第二个回发中。

<asp:Textbox>AutoPostBack属性设置为false来解决此问题。

+0

谢谢!我检查了我的代码,这也是我的问题:我忘了在aspx页面中删除文本框标记的AutoPostBack = true属性。我用它来调试一些服务器端验证代码,而不是做客户端JavaScript。当我删除它时,中提琴,点击事件触发每次我点击按钮。现在按钮点击事件方法可以更新文本框。发布有关您自己问题的解决方案,为我节省了数小时的在线搜索问题。 Grrr,我讨厌ASP.NET,但必须在工作中使用它。 – 2014-10-07 13:45:52

5

速战速决是一个ID设置为您加载一个页面上的ASCX控制。例如,如果你的代码是这样的:

 UserControl SpecsControl = (UserControl)Page.LoadControl("../name.ascx"); 
     SpecsContainer.Controls.Add(SpecsControl); 

那么你需要添加一行(Controls.Add被前):

  SpecsControl.ID = "Aribtrary_Name"; 

那么你的处理方法是在第一次点击解雇。

0

对我来说,这是UpdatePanel,我的Button和我的TextBox都在UpdatePanel之内,所以当我回传时,它引起了一些奇怪的行为。它在UpdatePanel之外并且修复了它。

0

即使我有同样的问题。原因是“localhost:1656/secure/login.aspx?ReturnUrl =%2f”。 如果请求包含%2f作为查询字符串,则即使“%2f”表示“/”,第一个帖子也不会成功。通过在页面加载

protected void Page_Load(object sender, EventArgs e) 
{ 
    string queryString = Request.QueryString.ToString(); 
    if(queryString == "ReturnUrl=%2f") 
    { 
     Response.Redirect("/secure/login.aspx"); 
    } 
} 
相关问题