手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

用MasterPage 代替 PageBase

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

目的:
实现用MasterPage中的.cs文件 代替项目中的PageBase。

动机:
写这篇文章的动机,来自于一次项目重构。在.Net Framwork 2.0的B/S架构项目中同时采用PageBase和MasterPage技术,发现每次访问页面,页面同时访问PageBase和MasterPage,不仅造成性能降低,甚至有可能给日后的项目功能扩充和调整带来逻辑错误隐患。

技术环节:
PageBase:.Net Framework 1.1 中经常使用的一种封装多个页面相同功能的技术。PageBase.cs类继承自System.Web.UI.Page类,项目中的Web页面继承自PageBase.cs类,通过重写基类中的页面初始化方法,实现调用PageBase中的业务功能,例如:url参数验证,保存访问量等功能(具体实现方式参见微软官方例子duwamishi)。
MasterPage:.Net Framework 2.0 中新特性,物理上包括两个文件,分别是:.Master文件(html标记),.cs文件(C#代码)。.Master文件实现显示层绘制,.cs文件实现具体功能。继承自MasterPage的Web页面可以继承MasterPage中的显示层内容。绘制通用的页头页脚,定制统一的布局,MasterPage是不错的选择。

模拟需求:
用MasterPage技术,代替PageBase,实现地址栏参数验证。
简单的做个解释吧,数据库中Login表信息如下图:

登录系统之后,url地址栏中带有参数,如下:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
此时用户手动修改url地址栏中参数为:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
被视为非法操作,系统将自动跳转回登录页面。


第一次代码迭代:


1.参照传统PageBase方法:
传统的Page做法为:
public class PageBase : System.Web.UI.Page
{
public PageBase()
{
}
/**//// <summary>
/// 入口方法
/// </summary>
protected void Initialize()
{
// 插入通用业务逻辑
}
}
Web页面:
public partial class TestPage : PageBase
{
// 传统的调用PageBase的方法
/**///// <summary>
/// 重写基类OnPreInit() 方法,调用通用验证方法
/// </summary>
/// <param name="e"></param>
protected override void OnInit(eventargs e)
{
base.Initialize();
}
}
参照其做法,将PageBase中的代码移入MasterPage中:
MasterPage.cs:
public partial class MyMasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 调用验证方法
Initialize();
}
}
}
将Web页面中的代码修改为:
public partial class TestPage : System.Web.UI.Page
{
// 仿照PageBase方法,调用Master中的方法
/**//// <summary>
/// 重写基类OnPreInit() 方法,调用通用验证方法
/// </summary>
/// <param name="e"></param>
protected override void OnInit(eventargs e)
{
// 获得母板页引用
MyMasterPage myMasterPage = (MyMasterPage)this.Master;
// 调用母板页中通用验证方法
if (!IsPostBack)
{
myMasterPage.Initialize();
}
}
}将MasterPage中的Initialize()方法替换为实例中的,测试代码:
步骤1:用 用户名zhangsan登录系统,登录成功,
页面显示 欢迎 zhangsan 登录。
url地址显示:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
步骤2:手动修改url地址栏:如下:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
页面不会显示 欢迎lisi登录,而是跳转回登录页面。
反思:虽然功能实现,但是存在不理想的环节:
1. Master中的被子类调用方法必须是public方法;
2. 虽然不用修改Web页的继承,但是依然要机械的复制粘贴重写基类的OnInit()方法。
为了消除这些怀味道,于是开始:
第二次代码迭代:
修改MasterPage.cs中的代码:
public partial class MyMasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 调用验证方法
CheckLogin();
}
}
/**//// <summary>
/// 验证访问是否合法
/// </summary>
private void CheckLogin()
{
// 如果 url中的编号 或 cookie中的编号
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}// 如果url中的编号 和 cookie中的编号 不匹配,返回登录页
else if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}重构之后,Web页可以不进行任何修改,MasterPage在自身的Page_Load()方法中自动调用验证方法,而且将验证方法设置为private,仅供MasterPage自身调用,提高安全性。至此,代码似乎比较理想了,测试:
步骤一:用 用户名 zhangsan登录系统,
依然显示用户登录页面。
测试失败。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!