亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用MasterPage 代替 PageBase

2019-11-18 16:54:01
字體:
來源:轉載
供稿:網友

目的:
        實現用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.49028c.com/Files/ayuan/MasterPageBaseDemo.rar
本人之前沒有寫技術文章的經驗,所以以上的文字難免晦澀,而且自身技術水平也有限,可能有些觀點不太成熟,歡迎各位朋友指正。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成免费电影| 久久手机精品视频| 好吊成人免视频| 日韩在线观看网站| 欧美一级淫片丝袜脚交| 欧美一区二区大胆人体摄影专业网站| 日韩在线观看免费全| 中文字幕精品一区二区精品| 日韩欧美aaa| 成人精品久久一区二区三区| 亚洲欧美一区二区三区情侣bbw| 亚洲一区美女视频在线观看免费| 国产精品爽黄69天堂a| 国产精品高潮呻吟久久av黑人| xxav国产精品美女主播| 在线精品播放av| 亚洲精品短视频| 日韩国产中文字幕| 欧美精品激情视频| 日韩免费在线免费观看| 欧美大尺度激情区在线播放| 亚洲a在线播放| 国产玖玖精品视频| 精品亚洲精品福利线在观看| 91精品久久久久久久久久| 亚洲自拍小视频免费观看| 视频一区视频二区国产精品| 国产精品免费久久久久影院| 欧美激情亚洲视频| 亚洲第一区中文字幕| 久久精品一偷一偷国产| 欧美日韩国产丝袜另类| 美乳少妇欧美精品| 91久久精品一区| 久久久亚洲影院| 国产精品精品一区二区三区午夜版| 日韩中文字幕欧美| 精品久久久久久久久久ntr影视| 欧美最猛性xxxxx亚洲精品| 欧美亚洲成人xxx| 久久躁日日躁aaaaxxxx| 亚洲护士老师的毛茸茸最新章节| 欧美日韩一区二区免费视频| 成人午夜激情免费视频| 国产成人精品电影久久久| zzjj国产精品一区二区| 性欧美暴力猛交69hd| 久久久999精品视频| 国产精品日韩欧美综合| 亚洲夜晚福利在线观看| 国产精品网红直播| 日韩av资源在线播放| 九九热这里只有精品6| 国产精品久久久久久久一区探花| 久久99精品久久久久久琪琪| 欧美激情图片区| 亚洲天堂av在线免费观看| 中文字幕国产日韩| 亚洲精品福利资源站| 日韩欧美国产一区二区| 欧美国产日韩精品| 国产亚洲福利一区| 日韩欧美成人精品| 亚洲午夜久久久影院| 日韩经典第一页| 国产激情久久久久| 日韩网站在线观看| 国产日韩欧美在线观看| 精品伊人久久97| 日韩女优人人人人射在线视频| 欧美日韩精品国产| 成人免费看吃奶视频网站| 国产视频欧美视频| 久久久久久久91| 日本久久久久亚洲中字幕| 久久久精品免费视频| 韩国国内大量揄拍精品视频| 97免费中文视频在线观看| 欧美性极品少妇精品网站| xxav国产精品美女主播| 欧美在线观看一区二区三区| 影音先锋日韩有码| 欧美极品在线视频| 亚洲自拍偷拍色片视频| 亚洲精品之草原avav久久| 国产精品主播视频| 中文精品99久久国产香蕉| 日本不卡免费高清视频| 性夜试看影院91社区| 日韩成人黄色av| 91九色视频导航| 在线观看成人黄色| 成人免费视频xnxx.com| 日韩在线资源网| 性亚洲最疯狂xxxx高清| 国产欧美精品在线播放| 日韩av在线一区二区| 高清一区二区三区四区五区| 欧美多人爱爱视频网站| 中文字幕欧美亚洲| 美女精品视频一区| 亚洲欧美另类自拍| 久久久久成人精品| 日韩高清欧美高清| 国产91精品久久久久| 91九色精品视频| 日韩一区视频在线| 欧美激情videoshd| 欧美—级高清免费播放| 欧美整片在线观看| 国产精品美腿一区在线看| 国产精品视频免费在线观看| 亚洲精品第一国产综合精品| 日韩精品视频免费在线观看| 亚洲美腿欧美激情另类| 中文字幕欧美专区| 国产成人精品久久二区二区91| 97国产suv精品一区二区62| 美女扒开尿口让男人操亚洲视频网站| 这里只有精品久久| 欧美日韩亚洲一区二区三区| 亚洲精品动漫久久久久| 免费av一区二区| 国产精品久久二区| 伊人精品在线观看| 理论片在线不卡免费观看| 91av视频导航| 欧美成人在线免费视频| 国产97人人超碰caoprom| 亚洲高清久久久久久| 欧美乱妇40p| 中文字幕精品一区久久久久| 国产区精品在线观看| 国产婷婷成人久久av免费高清| 一区二区三区回区在观看免费视频| 国产不卡一区二区在线播放| 久久久久久久久国产| 日本a级片电影一区二区| 国产在线拍偷自揄拍精品| 中文字幕亚洲一区在线观看| 成人福利网站在线观看| 日韩中文字幕第一页| 国产精品一久久香蕉国产线看观看| 日韩精品中文字幕有码专区| 另类视频在线观看| 欧美一级成年大片在线观看| 成人精品视频在线| 伊人伊成久久人综合网站| 91视频九色网站| 成人午夜激情免费视频| 亚洲午夜小视频| 成人有码在线播放| 亚洲欧美日韩精品久久奇米色影视| 中文字幕亚洲欧美一区二区三区| 97超级碰在线看视频免费在线看| 亚洲天堂视频在线观看| 91精品国产91久久久久久不卡| 中文字幕成人精品久久不卡| 亚洲国产精品成人一区二区| 九九视频直播综合网| 国产精品自产拍在线观| 中日韩美女免费视频网址在线观看| www.xxxx欧美| 国产一区二区三区在线观看视频|