在页面加载时调用一个方法

本文关键字:一个 方法 调用 加载 | 更新日期: 2023-09-27 18:25:56

我想让这段代码在c#代码背后工作。我知道在C中可以做类似的事情,但在这里可以做吗?

protected void Page_Load(object sender, EventArgs e)
{
    Bar.Text = "Updating Information";
    InsertData();
    Bar.Text = "Information Updated";
}

protected void InsertData(object sender, EventArgs e)
{
  //loops and statements
}

有什么想法吗?

在页面加载时调用一个方法

两件事。首先,您没有传递预期的参数:

protected void Page_Load(object sender, EventArgs e)
{
    Bar.Text = "Updating Information";
    InsertData(sender, e);
    Bar.Text = "Information Updated";
}

protected void InsertData(object sender, EventArgs e)
{
    //loops and statements
}

其次,这看起来像ASP.NET Web窗体。对控件的Text属性所做的更改不会更新UI。为了理解原因,你必须了解在你编写的实际代码之外到底发生了什么。ASP.NET WebForms具有非常高的"控制反转"程度;您的代码是为驻留在IIS Web服务器中的ASP引擎服务的,并且对它何时运行(甚至当存在时)几乎没有最终控制权。

这对你有两个主要后果;首先,服务器保留的关于每个客户端向其请求页面的状态信息量非常低;理想情况下,不保存任何状态(但实际上,服务器通常必须跟踪某些"会话状态",尤其是对于需要登录的安全web应用程序)。事实上,您的codeehind类只存在于呈现页面所需的时间;之后,类(以及它试图存储在内存中的任何状态数据)将被处理并进行垃圾收集。

其次,对您来说更重要的是,在代码绑定中为呈现下一个请求的页面所做的任何操作都不会导致客户端的实时更新;代码在codeehind中所做的一切,从Page_Load到Page_OnPreRender,都是在将生成的HTML的一位发送回客户端之前执行的。结果是,在执行代码绑定事件处理程序期间多次更改表单上控件的值对客户端看到的内容没有任何影响,除非您专门设置了与客户端的额外通信。在调用InsertData()之前更新Bar.Text不会导致客户端看到消息"updating Information"。客户端将看到的只是"Information Updated",因为这是当页面最终呈现为HTML时的控件文本,所有事件处理程序执行之后。

像这样的问题通常可以通过AJAX(异步Javascript和XML)等异步体系结构来解决。JavaScript对浏览器窗口中渲染页面的控制水平与WinForms应用程序的控制水平相当(足以让您仅使用客户端JavaScript就可以用HTML作为UI来编程简单游戏),并且JavaScript可以使用一些方法和对象向服务器发送数据请求。因此,为了在插入操作期间保持用户显示的页面的响应性,可以使用这些技巧。你的页面上会有一个按钮,它不会触发整个页面的完整回发,而是会在客户端上触发一个Javascript方法,该方法会向你的服务器发送一个web服务请求,并将你的Bar UI控件文本的值更新为状态"Updating Information"。服务器将执行一个操作(您的"InsertData()"调用),然后响应客户端的浏览器,这将触发第二个JavaScript方法,该方法将使用"Information Updated"再次更新状态。

顺便说一句,事实上,使用这种基于Javascript的"面向服务的架构"为所有内容更新创建整个web应用程序是可能的,其中只有一个初始HTML页面被提供给客户端浏览器,以及对该页面布局的所有进一步更改,通过JavaScript基于从web服务调用接收的数据更新一个页面的DOM来控制内容和行为。这样的网站架构有其缺点,但也有一些很大的优点。

Bar.Text = "Updating Information";
InsertData(this, EventArgs.Empty);
Bar.Text = "Information Updated";

您可以更改InsertData()方法,因为您调用它时没有参数。

protected void InsertData()
    {
      //loops and statements
    }

您需要知道发送方还是传递EventArgs?您可以简单地将InsertData方法重新定义为

protected void InsertData()
{
  //loops and statements
}

然后通过调用该方法

Bar.Text = "Updating Information";
InsertData();
Bar.Text = "Information Updated";