为什么单击按钮时会触发Page_Load?

时间:2020-10-22 09:04:17

标签: c# asp.net

我有类似的东西

protected void Page_Load(object sender, EventArgs e){
 country.Text = "USA";
}
protected void Button_Click(object sender, EventArgs e){
 Console.Write(country.Text);
}

,并且当用户单击按钮时,即使他们在country TextBox中写了其他内容,它也始终打印“ USA”,这意味着每次按钮(或任何其他按钮)都会触发Page_Load()事件,我想)被点击了。
通过查看this问题,我知道如何解决此问题,但是为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

该网页位于客户端网络浏览器上。当您单击按钮时,整个页面将被发送到服务器。现在,您背后的代码不仅可以运行,而且可以修改控件,并且可以执行您想要的任何事情。一旦所有代码运行完毕,浏览器页面便被发送回客户端。

我经常建议FirstPage加载事件对这里的山脉有帮助。但是,随着时间的流逝,我认为每次都必须触发的页面加载很好,并且该设置实际上有助于并促进了每次运行的事实。但是,在桌面开发中-从VB6,.net,甚至还有delphi和C ++桌面形式?页面加载甚至仅触发一次。因此,是的,对于许多Web表单不能以这种方式工作感到惊讶。底线是每次页面加载都会触发,而简单的问题是每次都会向服务器发送一个全新的新页面。因此,尽管可能有两个事件,但在两种情况下通常都必须运行大量页面加载代码。因此,发生两个单独的事件会造成同样多的麻烦。

那么对于第一次运行的代码(例如设置文本框值)?好吧,如果您需要每次都运行该代码(并且您可能会!!!),则将其放置在检查IsPostback的if / then块之外。因此,要使用代码来设置诸如默认值之类的内容-是的,您需要在IsPostBack = false块中使用该代码。

网页是我们所说的无状态网页。他们坐在用户桌面上。没有到服务器的实时连接。用户可以关闭该Web浏览器或关闭计算机。而且,当用户关闭浏览器时-没有信息或通话会发送到服务器。因此,您可以让2或2000个用户在其浏览器中键入或编辑-Web服务器不在乎,看不到甚至知道用户在做事。并且Web服务器认为它们未连接。它们只是一个网页-该页面可以关闭-服务器甚至不知道用户关闭了该网站(没有桌面软件之类的网页关闭事件)。因此,整个网页的设计是无足轻重的,因此不予理.。 Web服务器不知道该网页是否仍在打开,正在使用或已关闭。如果将页面发送回服务器,则Web服务器只能执行任何操作。届时,该网页中的所有内容都会从头开始重新发布(因此称为“无状态”)。但是,值得庆幸的是,诸如文本框之类的东西都具有所谓的“视图状态”,并且它们确实能够在往返中幸存下来。如果控件没有视图状态,则它们也将在每次回发时丢失其值。 Webforms的一个非常不错的功能是大多数控件都具有保持其视图状态的能力(这仅意味着此类控件的值可以在往返过程中幸存下来。

因此,当您单击按钮时,必须进行整页的回发,因为后面运行的任何代码都无法查看/查看/更改表单上控件的值。实际上,我们经常看到有人说要运行ajax Web方法(在同一页面中),然后想知道为什么他们背后的代码(在该Web方法中)不能更改控件。实际上,您可以编写代码来更改控件,但是它仅更改服务器端副本,而位于用户桌面上的副本不会更改。实际上,当他们(最终)进行回发时,所更改的任何代码都将丢失。

因此,当您单击按钮时,页面加载事件将首先运行,然后运行您的按钮代码。就是这样。

那么,当我开始在页面加载中键入和编写代码时,有99%的时间?

您执行以下操作:(例如,用数据表加载数据网格)。

if IsPostBack = False then
   GridView1.Datasource = myrst("SELECT * from tblhotels")
   GridView1.Databind()
End if

因此,您必须“假设”和“编写”代码,这意味着每次都会触发页面加载事件。但是,在上面,我们只希望第一次设置代码(加载gridview)运行一次-第一次加载页面。所以现在,您可能在页面上有5-6个按钮,由于我们检查/测试这是否是回发邮件,因此页面加载中的上述代码将无法运行。

因此整个网页必须向上移动到服务器,否则后面的代码无法修改网页上的任何控件或值。一旦运行了该代码,页面就会向下浏览到客户端,并再次位于用户桌面上。因此,单击按钮必须将整个网页发送回服务器,否则无法修改网页上控件的值,更糟糕的是,该代码的结果将永远不会显示在浏览器中。因此,后面的代码不能只修改一个控件。它首先需要整个网页副本,然后您可以更改控件(或多个控件),然后整个页面才能返回浏览器。因此,如果不首先拥有包含所有内容的完整网页副本,就无法编写代码来仅更改一个控件。但是,您可以使用所谓的更新面板。这将允许您运行更新页面的一部分的代码。但是,即使在这种情况下,页面回发事件也确实会首先运行-这通常称为部分页面回发。因此,您可以放入一个更新面板,并在该更新面板中包含按钮和代码-他们只能在该更新面板中进行修改,但是请注意,整个页面不会重新打印或刷新。您还可以手工编写JavaScript ajax调用代码,它们可以在客户端修改某些控件(甚至在服务器端调用例程)。但是,您仍然必须假设,在网页浏览到服务器之前,后面的代码无法看到+使用这些控件。即使在使用最新面板时,这也适用(后面的代码只能在更新面板中修改控件)。更新面板非常好,因为您不必连接并手工编写一堆ajax和JavaScript即可对网页进行部分更新,而不必引起整个页面的回发。但是如前所述,即使使用更新的面板,页面加载事件也会触发。因此,在大多数情况下,通常您会在该postback = false代码块内编写页面加载和设置代码。

答案 1 :(得分:-1)

这是ASP.Net Button类告诉我们的Button类的信息:

默认情况下,Button控件是“提交”按钮。提交按钮 没有命令名称(由CommandName属性指定) 与按钮相关联,只需将网页发布回 服务器。您可以为Click事件提供事件处理程序,以 以编程方式控制“提交”按钮时执行的操作 单击。

相关问题