大家好,又见面了,我是你们的朋友全栈君。
我们进行asp.net Web开发时,我们会习惯性的在后台的Page_Load()方法中通过IsPostBack属性的判断加载数据。那么,问题来了,你是如何知道页面加载的时候会执行Page_Load()这个方法呢?你在后台通过委托绑定了?微软通过某些方式替我们处理了?今天我们的就以此为切入点进行进一步讨论。
在进一步讨论之前,我们需要了解页面的一个特殊属性AutoEventWireup。简单来说,这一属性决定了当前页是否自动关联某些特殊事件。
空洞的文字讨论无意义,我们以熟知的项目来和大家一起了解。
上面是我做的一个登陆页面,在页面第一行的Page命令中,我设置了页面的AutoEventWireup 属性为true。(微软默认已经帮我们设置为true了)
在进一步探究AutoEventWireup 属性之前,我们还需要了解Asp.net的事件模型。
首先,在浏览器页面触发的事件不能立刻在本地得到处理,而是POST至服务器上,因此,Asp.NET建立了委托(代理)机制。在建立一个事件的同时,建立相应的委托:
private void InitializeComponent()
{
this.mybutton.Click += new System.EventHandler(this.Button1_Click);//委托
}
private void Button1_Click(object sender, System.EventArgs e)
{
//事件内容
}
委托将事件与该页面显式关联。
简单的了解了asp.net的事件模型,接下来我们就来看下事件模型与页面的AutoEventWireup属性的关系。
在AutoEventWireup=”false”时,如果没有委托,事件将不执行。
但,Asp.NET中可以修改AutoEventWireup=”true”,使页面与某些特殊的事件方法绑定,自动识别这些具有特定名称的事件,而不需要进行委托。到这里,文章开头的问题得到了解决:微软通过AutoEventWireup属性已经帮我们进行了事件与页面的隐式关联。这些特定名称包括:Page_Init, Page_Load, Page_DataBind, Page_PreRender和Page_Unload等。比如:
private void Page_Load(object sender, System.EventArgs e)
{
// 事件内容
}
针对这些事件方法,开发人员可以利用AutoEventWireup属性设置为true该避免编写过多的链接代码。
如果该属性设置为”false”,则代码应改为:
private void InitializeComponent()
{
this.mybutton.Click += new System.EventHandler(this.Button1_Click);//委托
this.Load += new System.EventHandler(this.Page_Load);//可以用AutoEventWireup属性避免的委托
}
private void Page_Load(object sender, System.EventArgs e)
{
// 事件内容
}
private void Button1_Click(object sender, System.EventArgs e)
{
//事件内容
}
总结:
(1)asp.net的事件模型要求通过委托实现页面与后台事件的结合,不论AutoEventWireup设置为true还是false都需要遵循asp.net的事件模型
(2)AutoEventWireup=”true” 微软已经帮我们实现了隐式结合,我们不需要显示结合了,那么页面首次加载的时候isPostback=false;会自动执行Page_Load方法 ;触发页面的事件时(如按钮单击),也会先执行Page_Load方法(只是这个时候的isPostback=true),接着再去执行对应的事件
(3)AutoEventWireup=“false” 要求我们自己实现显示结合
(4)大部分情况下,页面不需要关联如此多的特殊事件,会增加额外的操作和系统开销。因此,Microsoft 建议始终将 AutoEventWireup 设置为 FALSE,为什么会这么说呢?简单点来说,我们可以从也页面的后台代码中看出些端倪。微软只为我们实现了Page_Load()方法,并未为我们实现上面列举的那么多关联方法:因为我们很多都用不到。
其次,我们每次通过按钮提交数据的时候都会造成页面的重新加载:会造成Page_Load()方法的再次执行。也就说当我们点击提交按钮时,方法会先执行Page_Load(),然后再执行你绑定的提交事件方法。是不是很繁琐?
(5)通过上面的讲解,我们可以看出AutoEventWireup=”true”或“false”与isPostBack的true/false直接相关
参考:
Asp.net的事件模型
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140265.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...