在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之前要执行的公用函数代码,就可以通过这样的方式来处理。