0

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

4

3 回答 3

2

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

例子

页面

public partial class MyAspxPage : BasePage
{

}

基本页面

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

    }
}

您还应该将 AutoEventWireup 设置为 false。

于 2013-04-22T11:34:43.137 回答
1

会话开始不合适,因为它只会在用户获得新会话时触发,而不是每次加载页面时触发。

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

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

您将需要创建一个实现 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

于 2013-04-22T11:50:24.167 回答
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>
于 2013-04-22T11:36:16.533 回答