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