大家好,又见面了,我是你们的朋友全栈君。
这句代码是自动生成的,在代码的第一句,那么你理解这个 意思吗?
下面,着重说一下AutoEventWireup。大家可能不太注意这个,系统自动生成的一般我们情况下不用考虑,下面我们通过一个例子看一下这到底是什么?
如下是一个简单的计算机例子,三个Textbox控件,两个Label,一个Button组成。在这里我们的AutoEventWireup的值为True。
我们看一下代码:
代码语言:javascript复制namespace ASP.NET{ public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { this.TextBox1.Text = "1"; this.TextBox2.Text = "2"; } protected void Button1_Click(object sender, EventArgs e) { double a, b, c; try { a = double.Parse(this.TextBox1.Text); b = double.Parse(this.TextBox2.Text); } catch { Response.Write("只能输入数字"); return; } c = a b; this.TextBox3.Text = c.ToString(); } }}
我们在Page_Load事件中给Textbox1和Textbox2都赋值了,下面我们运行一下:
根据我们设定的结果出现了,现在我们把AutoEventWireup的值设为False看看
其他代码全不变,运行结果:
思考1,为什么Textbox1和Textbox2没有被赋值?
咱们现在把AutoEventWireup的值改为True,其他代码不变,相加一个试试,运行结果:
输入8 8点击求和,可以看到如下页面:
不论输入多少次结果总是1 2=3。
思考2,为什么相加结果不变?如何修改可以得到我们想要的结果?
现在我们就回答以上的两个问题。
1.在AutoEventWireup为False的情况下,Textbox1和Textbox2没有被赋值,则没有执行Page_Load方法,为什么?MSDN解释:AutoEventWireup 指示页的事件是否自动连网。如果启用事件自动连网,则为 true;否则为 false。简单来说就是Page指令的AutoEventWireup属性置为True时,该页框架将自动调用页事件,即Page_Load,Page_Init方法,这种情况下,不需要任何显示的Handles子句或委托。当AutoEventWireup为True是,Html中服务端脚本才被执行。
2.在AutoEventWireup为True的情况下,不论输入任何数运行结果总是1 2=3,因为AutoEventWireup为True时每次提交页面都会先执行行Page_Load方法,再执行控制的事件方法。从表面看,就是Page_Load成了aspx.cs文件中必须而且首先执行的方法。那么如何解决呢?有两种方法:(1)将AutoEventWireup置为False;(2)使用Page类的IsPostBack属性,修改Page_Load方法代码,如下:
代码语言:javascript复制 protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { this.TextBox1.Text = "1"; this.TextBox2.Text = "2"; } }
如此问题便解决了。
下面加深一步思考:在Textbox1和Textbox2两个文本框中分别赋值1和2后,单击求和按钮,讲表单中控件的值传送到服务器,Default.aspx.cs中的程序依次执行Page_Load方法和Button_Click方法,然后再一次生成HTML网页。当再一次生成HTML网页时,两个文本框应该会自动设置为初始值(即空值)状态,这就是Web的无状态性,即Web不能够保存上次程序完成时的那些变量值,但是事实上这是的TextBox1和TextBox2两个文本框中仍然显示着单击求和按钮之前的1和2,是什么将1和2自动填写在两个文本框中呢?好吧,是ASP.NET用另一种方法讲控件的值或状态持续地保存了下来,具体做法:
服务器执行Default.aspx.cs中所有的程序后,将当前控件的状态值记录到表单的一个隐藏区域(<input type=”hidden”>)中,在提交后,ASP.NET解析这个隐藏域的值,重新获取各控件的状态,这样就能够保持Web控件的状态不停地传递下来,这个过程有点像操作系统调用中断时,将当时各寄存器的状态都保存起来,中断结束后,再将寄存器的状态又恢复回来。大家可能注意到当提交操作时地址栏中会有一个常常的QueryString,其中有一个键值名为_VIEWSTATE,就是保存各个控件状态。在浏览器中查看网页源码能够找到如下代码:
综上,当我们需要赋初始值时,AutoEventWireup这个属性一定要注意,否则很容易犯错误。
个人理解,如有错误,敬请指正!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140215.html原文链接:https://javaforall.cn