ASP.NET中每个页面在Load之前调用公用函数

时间:2021-05-03 13:05:51

    在ASP.NET程序的权限设计中,遇到了一个问题,需要每个页面都调用一个公用的函数,改函数需要

在每一个页面执行的时候,自动检查使用者是否有该页面的使用权限,并且需要取得该页面上相关功能权

限,并回传该页面的Title对它作修改;还需要保存使用的访问记录方便查询。
    1、用什么方式,能够在编写ASPX的时候用最少的代码可以实现这一功能;
    2、用什么方式调用公用的函数,更方便处理;
    针对这些问题,第一个想到的就是ASP2.0中的MasterPage功能,因为在asp.net2.0下基本上都会使用

到MasterPage,在MasterPage的PageLoad事件中来处理用户权限的问题,这样每个页面引用MasterPage就

能够使用了;但是经过测试后发现,MasterPage的PageLoad事件竟然是发生在ContentPage的PageLoad之

后的,这就意味着这样做,使Content Page就无法在PageLoad事件中调用公用的函数。
    在使用过程中发现当新增aspx并使用CodeFile方式时,可以看到在CodeFile的CS文件中有这样的内容

,如下:
public partial class Default : System.Web.UI.Page
{
}
其中该Class继承了System.Web.UI.Page,这样我们就可以写一个Class来代替System.Web.UI.Page;这里

我们来创建一个这样的类。
1、首先在解决方案项目上按右鍵→加入新项→选择模板[类]→名称[PageBase.cs],如果你还没有启用

App_Code的文件夹,系统提示是否新增App_Code,并将该文件放入文件夹中,确定后,会在App_Code中增

加PageBase.cs文件,内容如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for PageBase
/// </summary>
public class PageBase
{
    public PageBase()
    {
        //
        // TODO: Add constructor logic here
        //
    }
}
2、接下来让PageBase继承System.Web.UI.Page,如下:
public class PageBase : System.Web.UI.Page
这样就可以使用page的相关事件了。
3、下一步添加一些函数和属性,用来测试这些方法,代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for PageBase
/// </summary>
public class PageBase : System.Web.UI.Page
{
    Boolean _IsBrwP = false;

    public PageBase()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    public string SayHello(string inStr)
    {
        return "Hello, " + inStr;
    }

    public Boolean BrwP
    {
        get { return _IsBrwP; }
        set { _IsBrwP = value; }
    }

    public void ChkBrwP(string UID)
    {
        if (UID == "li")
        {
            BrwP = true;
        }
        else
        {
            BrwP = false;
        }
    }

    private void Page_Load(object sender, EventArgs e)
    {
        Response.Write("PageBase Load.<br>");
    }
}
4、新增一个aspx页面文件,用来测试PageBase,如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="btn1" runat="server" Text="设定UID为li" OnClick="btn1_Click" /><br />
            <asp:Button ID="btn2" runat="server" Text="设定UID为liu" OnClick="btn2_Click" /></div>
    </form>
</body>
</html>
5、修改Default2.aspx.cs文件,把原本默认继承System.Web.UI.Page改为继承PageBase,如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Default2 : PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string sUid = Request.QueryString["UID"];
        string sRc = this.SayHello(sUid);
        Response.Write("Default2.aspx Load.<br>");
        Response.Write(sRc + "<br>");
        this.ChkBrwP(sUid);
        Response.Write(this.BrwP.ToString());
    }
    protected void btn1_Click(object sender, EventArgs e)
    {
        Response.Redirect("default2.aspx?UID=li");
    }
    protected void btn2_Click(object sender, EventArgs e)
    {
        Response.Redirect("default2.aspx?UID=liu");
    }
}
6、按F5运行看测试结果。
从运行结果可以看出,PageBase的Page_Load事件在Default2.aspx的Page_Load之前,并且也可以通过this.的方式弹出PageBase定义的函数和属性进行选用。因此一些在页面Load之前要执行的公用函数代码,就可以通过这样的方式来处理。