ASP.NET教程之ASP.NET技能:用MasterPage 取代 PageB...
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。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++产生以后就没有收到过好评。 ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。 PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。 ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。
页:
[1]