动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.C++中类的多态与虚函数的使用.
.C++中数组和指针类型的关系浅议.
.用Enter键控制焦点切换的方法.
.美丽的宝石.
.C语言编程常见问题解答之常用函数.
.用BCB开发有身份认证功能的Email.
.Linux 下 C++程序的异常处理技巧.
.qt简介.
.一个简单的打字练习程序.
.利齿C sharp代替C++?.
.生成静态连接库.
.C++的效率浅析.
.C语言初学者入门讲座 第二讲 数据.
.迷宫问题.
.数据结构学习C++——图(4&5&总结.
.C++ Builder 创建分布.
.编程修养-C语言篇.
.创建和使用库:静态、共享和动态.
.在libxxx.a文件中如何查找函数.
.C++语言常见问题解答(2).

用MasterPage 代替 PageBase

发表日期:2008-3-8 |


目的:
        实现用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登录系统,
                        依然显示用户登录页面。
                        测试失败。
用断点跟踪代码,发现问题出现在MasterPage.cs中的CheckLogin()方法中的代码片段:
if (string.IsNullOrEmpty(Request.QueryString["id"])
            string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
      Response.Redirect("Login.aspx");
}
由于登录页继续自MasterPage,所以页面加载时自动调用MasterPage.cs中的验证方法,而自身的参数又不满足string.IsNullOrEmpty()方法,于是又跳回到登录页面,登录页面在再次在加载时调用基类中的验证方法,于是形成死循环。
在PageBase技术中,Web页面可以有选择的继续自PageBase,而MasterPage技术中,为了获得一致的显示层效果,Web页面对继续MasterPage的选择性是非常底的,而且我们也不应该采用新建相同显示,不带有验证代码的MasterPage,来给不需要继续基类功能的Web页面来继续,这种方式显然不合理。为了解决这个问题,于是开始了
第三次迭代:
引入配置文件:
<?XML version="1.0" encoding="utf-8" ?>
<pages>
  <testpage>
    <page title="TestPage" url="TestPage.aspx" needvalidate="true"/>
    <page title="Login" url="Login.aspx" needvalidate="false"/>

  </testpage>
  <adminpages>
    <page title="Page1" url="~/Admin/Page1.aspx" needvalidate="false"/>
    <page title="Page2" url="~/Admin/Page2.aspx" needvalidate="false"/>
  </adminpages>
</pages>
从中可以看到,将需要验证的页面加以标识(needvalidate="true")。
创建Xml数据访问类:
public class XmlDAL
{
    private static string filePath = string.Empty;
    static XmlDAL()
    {
        // 初始化配置文件路径
        filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
    }
    /**//// <summary>
    /// 获得需要验证的页面列表
    /// </summary>
    /// <returns>需要验证的页面列表</returns>
    public static IList<string> GetValidatePages()
    {
        IList<string> pages = new List<string>();
        // 假如指定配置文件存在
        if (System.IO.File.Exists(filePath))
        {           
            try
            {               
                XmlDocument xmlDoc = new XmlDocument();                
                xmlDoc.Load(filePath);
                // 获取配置文件根节点
                XmlNode root = xmlDoc.DocumentElement;
                string XPath = "/pages/testpage/page[@needvalidate='true']";
                XmlNodeList nodeList = root.SelectNodes(xpath);
                // 便利节点集合
                foreach (XmlNode node in nodeList)
                {
                    pages.Add(node.Attributes["title"].Value);

                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }           
        }
        return pages;
    }
}
重构MasterPage.cs中的代码,加入IsValidateNeeded(string url)方法,用于检测当前页面是否需要验证,修改验证方法:
public partial class MyMasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // 调用验证方法
            CheckLogin();
        }
    }
    /**//// <summary>
    /// 验证访问是否合法
    /// </summary>
    private void CheckLogin()
    {
        // 判定当前访问页面是否需要进行验证
        if (IsValidateNeeded(Request.RawUrl))
        {
            // 假如 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");
            }
        }
    }
    /**//// <summary>
    /// 验证当前页是否需要验证

    /// </summary>
    /// <param name="currentPage">当前页面名称</param>
    /// <returns>是否需要验证状态</returns>
    private bool IsValidateNeeded(string url)
    {
        bool isNeeded = false;
        // GetValidatePages() 方法返回需要验证页面列表
        IList<string> pages = XmlDAL.GetValidatePages();
        IEnumerator<string> ie = pages.GetEnumerator();
        while (ie.MoveNext())
        {
            // 假如当前页面需要进行验证
            if (url.Contains(ie.Current))
                // 返回需要验证状态
                return isNeeded = true;
        }
        return isNeeded;
    }
}
进行测试:
        步骤1:用 用户名zhangsan登录系统,登录成功,
                      页面显示 欢迎 zhangsan 登录。
                      url地址显示:
                      http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
        步骤2:手动修改url地址栏:如下:
                      http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
        页面不会显示 欢迎lisi登录,而是跳转回登录页面。 至此我的代码迭代结束了。
代码下载:
http://www.cnblogs.com/Files/ayuan/MasterPageBaseDemo.rar
本人之前没有写技术文章的经验,所以以上的文字难免晦涩,而且自身技术水平也有限,可能有些观点不太成熟,欢迎各位朋友指正。
上一篇:两个截取字符串的实用方法(超过一定长度自动换行) 人气:738
下一篇:通过COM来获取CookieContainer,简单又好用 人气:349
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-6 Menalto Gallery v2.3 Rc2 多国语
2008-10-6 花香盈路(Hxcms) v9.0
2008-10-6 华军软件下载系统 v1.5
2008-10-6 e107 v0.7.13
2008-10-6 (开源PHP框架) CodeIgniter v1.6
2008-10-6 PHP在线考试系统PPExam v1.2.6 b
2008-10-6 SiteDynamic企业网站管理系统 v1
2008-10-6 WebPlayer9 P2P视频点播电影整站
2008-10-6 BCMS v1.1 测试版
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成