我使用的是Visual Studio 2012专业版。在page指令中,我没有看到为AutoEventWireup属性设置"true"one_answers"false"有任何区别。一直以来,它的行为都是"true",这意味着我设置了"false",并且没有显式绑定事件,但事件是隐式绑定的。如果我遗漏了什么,请告诉我。
此设置不是要触发事件,而是要将处理程序绑定到标准页面事件。比较说明处理Load
事件的这两个片段。
首先,使用AutoEventWireup="true"
:
public class PageWithAutoEventWireup
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Page_Load is called");
}
}
第二,使用AutoEventWireup="false"
:
public class PageWithoutAutoEventWireup
{
override void OnInit(EventArgs e)
{
this.Load += Page_Load;
}
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Page_Load is called");
}
}
在这两种情况下,Load
事件都将由页面触发,并由代码处理。但在第二种情况下,您必须显式注册该事件,而在第一种情况下ASP.NET会为您做所有事情。
当然,其他页面生命周期事件也是如此,如Init
、PreRender
等。
我知道这是一个旧线程,但我想我应该添加以下内容,这最近对我有所帮助:
除了Andrei的答案之外,还值得补充的是,通过将AutoEventWireup设置为"true",您将面临每次加载页面时调用Page_Load()两次的风险。这件事发生在我身上。这里有充分的解释,我从那里复制了以下内容:
如果性能是关键,请不要将AutoEventWireup设置为true考虑启用自动事件连线时,ASP.NET必须make在15到30之间尝试将事件与方法相匹配。
请注意以下关于将事件处理程序绑定到事件的内容:
如果您将AutoEventWireup设置为true,请确保您没有手动将页面事件处理程序附加到事件。如果你这样做了,处理人员可能被调用不止一次。
仅对页面事件执行自动绑定,不对事件执行以获取页面上的控件。
作为将事件绑定到处理程序的替代方案,您可以重写页面或控件的Oneventname方法。