|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。asp.net|erp|技能目标:
完成用MasterPage中的.cs文件取代项目中的PageBase。
念头:
写这篇文章的念头,来自于一次项目重构。在.NetFramwork2.0的B/S架构项目中同时接纳PageBase和MasterPage手艺,发明每次会见页面,页面同时会见PageBase和MasterPage,不但形成功能下降,乃至有大概给往后的项目功效扩大和调剂带来逻辑毛病隐患。
手艺环节:
PageBase:.NetFramework1.1中常常利用的一种封装多个页面不异功效的手艺。PageBase.cs类承继自System.Web.UI.Page类,项目中的Web页面承继自PageBase.cs类,经由过程重写基类中的页面初始化办法,完成挪用PageBase中的营业功效,比方:url参数考证,保留会见量等功效(详细完成体例拜见微软官方例子duwamishi)。
MasterPage:.NetFramework2.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做法为:
publicclassPageBase:System.Web.UI.Page
{
publicPageBase()
{
}
/**////<summary>
///出口办法
///</summary>
protectedvoidInitialize()
{
//拔出通用营业逻辑
}
}
Web页面:
publicpartialclassTestPage:PageBase
{
//传统的挪用PageBase的办法
/**/////<summary>
///重写基类OnPreInit()办法,挪用通用考证办法
///</summary>
///<paramname="e"></param>
protectedoverridevoidOnInit(eventargse)
{
base.Initialize();
}
}
参照其做法,将PageBase中的代码移进MasterPage中:
MasterPage.cs:
publicpartialclassMyMasterPage:System.Web.UI.MasterPage
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
//挪用考证办法
Initialize();
}
}
}
将Web页面中的代码修正为:
publicpartialclassTestPage:System.Web.UI.Page
{
//模仿PageBase办法,挪用Master中的办法
/**////<summary>
///重写基类OnPreInit()办法,挪用通用考证办法
///</summary>
///<paramname="e"></param>
protectedoverridevoidOnInit(eventargse)
{
//取得母板页援用
MyMasterPagemyMasterPage=(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中的代码:
publicpartialclassMyMasterPage:System.Web.UI.MasterPage
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
//挪用考证办法
CheckLogin();
}
}
/**////<summary>
///考证会见是不是正当
///</summary>
privatevoidCheckLogin()
{
//假如url中的编号或cookie中的编号
if(string.IsNullOrEmpty(Request.QueryString["id"])
||string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}//假如url中的编号和cookie中的编号不婚配,前往登录页
elseif(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页面来承继,这类体例明显分歧理。为懂得决这个成绩,因而入手下手了
第三次迭代:
引进设置文件:
<?xmlversion="1.0"encoding="utf-8"?>
<pages>
<testpage>
<pagetitle="TestPage"url="TestPage.aspx"needvalidate="true"/>
<pagetitle="Login"url="Login.aspx"needvalidate="false"/>
</testpage>
<adminpages>
<pagetitle="Page1"url="~/Admin/Page1.aspx"needvalidate="false"/>
<pagetitle="Page2"url="~/Admin/Page2.aspx"needvalidate="false"/>
</adminpages>
</pages>
从中能够看到,将必要考证的页面加以标识(needvalidate="true")。
创立Xml数据会见类:
publicclassXmlDAL
{
privatestaticstringfilePath=string.Empty;
staticXmlDAL()
{
//初始化设置文件路径
filePath=HttpContext.Current.Request.MapPath("~/App_Data/xml/"+"Pages.xml");
}
/**////<summary>
///取得必要考证的页面列表
///</summary>
///<returns>必要考证的页面列表</returns>
publicstaticIList<string>GetValidatePages()
{
IList<string>pages=newList<string>();
//假如指定设置文件存在
if(System.IO.File.Exists(filePath))
{
try
{
XmlDocumentxmlDoc=newXmlDocument();
xmlDoc.Load(filePath);
//猎取设置文件根节点
XmlNoderoot=xmlDoc.DocumentElement;
stringxpath="/pages/testpage/page[@needvalidate=true]";
XmlNodeListnodeList=root.SelectNodes(xpath);
//便当节点汇合
foreach(XmlNodenodeinnodeList)
{
pages.Add(node.Attributes["title"].Value);
}
}
catch(Exceptionex)
{
thrownewException(ex.Message);
}
}
returnpages;
}
}
重构MasterPage.cs中的代码,到场IsValidateNeeded(stringurl)办法,用于检测以后页面是不是必要考证,修正考证办法:
publicpartialclassMyMasterPage:System.Web.UI.MasterPage
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
//挪用考证办法
CheckLogin();
}
}
/**////<summary>
///考证会见是不是正当
///</summary>
privatevoidCheckLogin()
{
//判别以后会见页面是不是必要举行考证
if(IsValidateNeeded(Request.RawUrl))
{
//假如url中的编号或cookie中的编号
if(string.IsNullOrEmpty(Request.QueryString["id"])
||string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}//假如url中的编号和cookie中的编号不婚配,前往登录页
elseif(int.Parse(Request.QueryString["id"])!=int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}
/**////<summary>
///考证以后页是不是必要考证
///</summary>
///<paramname="currentPage">以后页面称号</param>
///<returns>是不是必要考证形态</returns>
privateboolIsValidateNeeded(stringurl)
{
boolisNeeded=false;
//GetValidatePages()办法前往必要考证页面列表
IList<string>pages=XmlDAL.GetValidatePages();
IEnumerator<string>ie=pages.GetEnumerator();
while(ie.MoveNext())
{
//假如以后页面必要举行考证
if(url.Contains(ie.Current))
//前往必要考证形态
returnisNeeded=true;
}
returnisNeeded;
}
}
举行测试:
步骤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.ckuyun.com/Files/ayuan/MasterPageBaseDemo.rar
自己之前没有写手艺文章的履历,以是以上的笔墨不免流畅,并且本身手艺程度也无限,大概有些概念不太成熟,接待列位伴侣斧正。
在VC.net的版本上,为了让C++运行在.NETFramework中,微软为C++引进了托管,就是托管C++(ManagedC++),这个根本就没有流行起来,自托管C++产生以后就没有收到过好评。 |
|