asp.net中是否有内置事件触发所有PageLoads?

时间:2013-04-22 11:30:33

标签: asp.net

完成我的asp项目后,我想出了一个新的要求。为此,我必须在所有页面Load事件中执行一些代码。我可以为所有这些页面加载获得一个事件吗?我不能使用Global.asax的Session_start,因为它将包含具有会话状态的WebHandler。有任何想法吗?

3 个答案:

答案 0 :(得分:2)

保留基页并从所有aspx页面继承它。通过这种方式,您可以保持逻辑集中。

示例

Aspx Page

public partial class MyAspxPage : BasePage
{

}

基页

public class BasePage : Page
{
    protected override void OnLoad(EventArgs e)
    {

    }
}

您还应将AutoEventWireup设置为false。

答案 1 :(得分:1)

会话启动不合适,因为只有在为用户提供新会话而不是每次加载页面时才会触发它。

有几个选项,包括使用您所有页面都继承的基页。这意味着您需要记住将其连接到所有页面。

我的建议是编写一个为所有aspx页面加载触发的http模块。

您需要创建一个实现System.Web.IHttpModule的模块。

using System;
using System.Web;
public class HelloWorldModule : IHttpModule
{
    public HelloWorldModule()
    {
    }

    public String ModuleName
    {
        get { return "HelloWorldModule"; }
    }

    // In the Init function, register for HttpApplication 
    // events by adding your handlers.
    public void Init(HttpApplication application)
    {
        application.BeginRequest += 
            (new EventHandler(this.Application_BeginRequest));
        application.EndRequest += 
            (new EventHandler(this.Application_EndRequest));
    }

    private void Application_BeginRequest(Object source, 
         EventArgs e)
    {
    // Create HttpApplication and HttpContext objects to access
    // request and response properties.
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        string filePath = context.Request.FilePath;
        string fileExtension = 
            VirtualPathUtility.GetExtension(filePath);
        if (fileExtension.Equals(".aspx"))
        {
            context.Response.Write("<h1><font color=red>" +
                "HelloWorldModule: Beginning of Request" +
                "</font></h1><hr>");
        }
    }

    public void Dispose() { }
}

然后按照此处的示例将其挂接到web.config中。

<httpModules>
  <add name="HelloWorldModule" type="HelloWorldModule" />
</httpModules> 

您需要检查模块中的context.Request.Path属性,以排除路径不符合您的条件的任何请求(即不结束aspx)。

此处有更多信息。 http://www.4guysfromrolla.com/demos/printPage.aspx?path=/articles/011404-1.aspx

答案 2 :(得分:0)

我认为这里最好的解决方案是创建一个自定义基页类,该类实现PageLoad,然后从中继承所有页面。

类似的东西:

public abstract class BasePage: Page
{
   protected void Page_Load(object sender, EventArgs e) {
      // your code
   }
}

您可以在web.config中注册基页类:

<system.web>
  <!-- ... -->
    <pages pageBaseType="MyWeb.UI.BasePage" />
  <!-- ... -->
</system.web>