【转】asp.net母版页应用
虽然基于PWS的Web站点功能简单,但是该应用程序却涉及多种ASP.NET 2.0新技术特性的应用。尤为关键的是,它还为利用ASP.NET 2.0技术创建两层Web应用程序提供了典型范本。在下面的几篇文章中将针对各种技术要点、实现方法展开分析。本文重点介绍母版页的应用方法。
1. 母版页应用
母版页是ASP.NET 2.0的新增功能,其主要用于替代过去的用户控件以实现页面模板功能,同时,母版页还提供了多种特性,可实现很多用户控件难以完成的功能,例如,母版页与 内容页之间的交互等。母版页在基于PWS的Web站点应用程序中应用广泛,它为提高页面开发效率,降低页面维护强度奠定了坚实基础。本文将介绍母版页在该 应用程序中的应用方法。
在解决方案资源管理器中,包括一个母版页文件Default.master。与*.aspx文件相同,Default.master文件同时还关联一个代 码隐藏页文件Default.master.cs。然而,由于该母版页仅处理页面呈现,而与其他业务逻辑无关,因此,读者将会发现代码隐藏页文件仅包括其 实际代码框架,并不包含任何业务逻辑等实际源代码实现。
首先,在Visual Studio 2005中打开Default.master文件,并切换至设计视图。如图1列举了设计视图。
![]() |
| 图1(点击看大图) |
如图1所示,母版页Default.master中主要包括了页首和页尾等页面公共部分内容,其中涉及多个服务器控 件,例如,Menu、SiteMapPath、SiteMapDataSource和LoginStatus等。同时,在页面中部使用一个 ContentPlaceHolder控件为内容页实现占位。当请求相关内容页时,.NET执行引擎将为用户发送母版页和内容页合并生成的结果页。这样, 用户可阅览具有多个相同页首和页尾结果页。对于开发人员而言,如果修改了母版页内容,例如,将文字"此处是您的姓名"修改为其他文字,那么用户看到的所有 结果页都将发生相应变化。
在Default.master页面底部,可以看到一个SiteMapDataSource控件。通过该控件可自动获取应用程序根目录下web.sitemap的数据。web.sitemap是站点地图文件,其以标准XML格式存储着Web站点结构数据,具体源代码如下所示。
| <?xml version="1.0" encoding="utf-8"?> <siteMap> <siteMapNode title="主页" url="Default.aspx"> <siteMapNode title="简历" url="Resume.aspx"/> <siteMapNode title="链接" url="Links.aspx"/> <siteMapNode title="相册" url="Albums.aspx"> <siteMapNode title="照片" url="Photos.aspx"> <siteMapNode title="详细信息" url="Details.aspx"/> </siteMapNode> </siteMapNode> <siteMapNode title="注册" url="Register.aspx"/> <siteMapNode title="管理" url="Admin/Albums.aspx"> <siteMapNode title="照片" url="Admin/Photos.aspx"> <siteMapNode title="详细信息" url="Admin/Details.aspx"/> </siteMapNode> </siteMapNode> </siteMapNode> </siteMap> |
由以上代码可知,web.sitemap文件中包括一个根节点siteMap。在根节点下包括一个起始节点"主页"和多个siteMapNode子节点, 其中设置了title和url属性。title属性用于设置节点名称,url属性用于设置节点的URL地址。为了使读者更加方便地了解 web.sitemap文件所设置的站点结构,下图2以图形方式显示了该站点结构。读者可以对照源代码理解其中的结构特征。
![]() |
| 图2 |
图2所示的结构层次非常清晰,在此不再多做说明。需要说明的一点是:如果开发人员对Web站点进行修改,例如,修改页面文件名称、增加/删除文件,那么必 须在web.sitemap文件中得到体现。同时,在修改过程中一定要牢记:节点的url属性值在整个web.sitemap文件中必须是唯一的。
理解如图2所示的站点文件结构对于准确有效的显示这些数据有着重要意义。在母版页中,共有4个服务器控件与web.sitemap文件相关,它们是SiteMapDataSource、Menu(2个)和SiteMapPath。下面列举了这些控件在母版页中的源代码。
| <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" StartingNodeOffset="0" /> <asp:SiteMapPath ID="SiteMapPath1" runat="Server" PathSeparator=" >" RenderCurrentNodeAsLink="true" /> <asp:Menu ID="menua" runat="server" DataSourceID="SiteMapDataSource1" CssClass="menua" Orientation="Horizontal" MaximumDynamicDisplayLevels="0" SkipLinkText="" StaticDisplayLevels="2" /> <asp:Menu ID="menub" runat="server" DataSourceID="SiteMapDataSource1" CssClass="menub" Orientation="Horizontal" MaximumDynamicDisplayLevels="0" SkipLinkText="" StaticDisplayLevels="2" /> |
SiteMapDataSource控件
该控件用于从web.sitemap文件中获取数据,并且这个过程是自动完成的。在设计时,只需将该控件拖放至母版页,而无需设置任何属性,即可完成获取 数据的任务。如上代码所示,其中为控件设置了一个StartingNodeOffset属性,该属性用于获取或设置一个从起始节点开始计算的正整数或负整 数偏移量,该起始节点确定了由数据源控件公开的根层次结构。属性值设置为0,表示由SiteMapDataSource公开的根层次结构与起始节点(名 为"主页"的节点)相同。
SiteMapPath控件
SiteMapPath控件能够根据站点结构信息,准确定位当前页面所处整个Web站点的位置,同时,使用层次化表示方法,将位置信息显示为有序的静态文 本或者超链接。另外,通髡喙厥粜裕梢宰远ㄒ逦恢眯畔⒌耐夤垡约捌渌谌荩佣视φ镜愕淖芴迳杓品绺瘛H缟洗胨荆渲兄饕柚昧薖 athSeparator和RenderCurrentNodeAsLink属性。前者用于获取或设置一个字符串,该字符串在呈现的导航路径中分隔 SiteMapPath节点。后者用于指示将当前显示页的站点导航节点呈现为超链接。另外,需要注意的是,默认情况下,SiteMapPath控件自动与 页面中的SiteMapDataSource控件实现绑定,从而显示站点结构信息,这个过程无需设置控件的DataSourceID属性。
Menu控件
在上文代码中包括两个Menu控件,它们的设置几乎相同。Menu控件可显示Web菜单。如上代码所示,Menu控件主要设置了 DataSourceID、Orientation、StaticDisplayLevels和MaximumDynamicDisplayLevels 属性。DataSourceID用于设置Menu控件所绑定的数据源控件ID。根据源代码可知,Menu控件绑定了前文所述的 SiteMapDataSource控件,这意味着Menu控件显示的数据来自web.sitemap文件。Orientation属性值设置为 Horizontal,其表示水平呈现Menu控件。StaticDisplayLevels属性用于获取或设置静态菜单的菜单显示级别数,其属性值设置 为2。这表示Menu控件显示头两级节点(主页是第1级,简历、链接、相册、注册和管理是第2级)。
MaximumDynamicDisplayLevels属性用于获取或设置动态菜单的菜单呈现级别数。由于该属性设置为0,因此,Menu控件最多可显示StaticDisplayLevels属性所指定的级别的静态菜单,而不会显示任何动态菜单。
细心的读者可能会发现一个有趣的现象。当管理员用户登录站点时,母版页Default.master中Menu控件将显示一个"管理"链接。如果以匿名用 户或者具有Friends角色的用户登录时,那么Menu控件将不显示 "管理"链接。这种功能是如何实现的呢?难道还需要自定义实现Menu控件的数据加载过程吗?实际上,实现这种功能很简单,只需在Web.config文 件中进行一些配置即可。相关配置代码如下所示。
| <system.web> ...... <roleManager enabled="true"/> <siteMap defaultProvider="XmlSiteMapProvider" enabled="true"> <providers> <add name="XmlSiteMapProvider" description="SiteMap provider which reads in .sitemap XML files." type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="web.sitemap" securityTrimmingEnabled="true"/> </providers> </siteMap> </system.web> <location path="Admin"> <system.web> <authorization> <allow roles="Administrators"/> <deny users="*"/> </authorization> </system.web> </location> |
以上代码设置了3项内容:(1)使用roleManager配置节启用角色管理功能;(2)使用siteMap配置节设置应用程序站点地图提供程序;(3)使用location配置节设置Admin文件夹的具体授权内容。
以上3项设置内容都与动态显示"管理"项有着密切关系。由于Admin文件夹中包括的文件都涉及站点管理功能,因此,只有Administrators角 色用户才有权限访问该文件夹。实现这一需求,需要设置内容(1)和内容(3)。这样,对于Admin文件夹的访问就与角色之间建立了紧密联系。例如,当非 授权用户通过SiteMapDataSource控件获取站点地图数据时,由于涉及访问Admin文件夹的信息,因此,存在一个节点筛选的问题。即 SiteMapDataSource控件不应获取与Admin文件夹相关的节点数据。如果用户已被授权,则不存在这个节点筛选过程。实现这一功能,必须设 置内容(2)。通过代码可知,应用程序的默认站点地图提供程序被设置为System.Web.XmlSiteMapProvider。需要注意的是其中设 置的securtyTrimmingEnabled = "true" 属性,这是一个非常关键的设置。securtyTrimmingEnabled属性用于启用站点提供程序的安全整理功能。该属性通过一个布尔值指示站点地图提供程序是否根据用户的角色筛选站点地图节点。如果提供程序被配置为根据角色筛选节点,则为True;否则为False。另外,不能以编程方式设置安全修整,因为,它只能在提供程序的配置中设置。
上文详细分析了一些与母版页Default.master相关的内容。下面简单说明一下内容页绑定母版页的实现方法。Default.master文件在 应用程序中为多个*.aspx文件(内容页)绑定使用。所有使用母版页的方法都大同小异,以Default.aspx为例,其相关源代码如下所示。
| <%@ Page Language="C#" MasterPageFile="~/Default.master" Title="此处是您的姓名 | 主页" CodeFile="Default.aspx.cs" Inherits="Default_aspx" %> <asp:Content ID="Content1" ContentPlaceHolderID="Main" runat="server"> ...... </asp:Content> |
如上代码所示,@ Page指令中设置了多个属性,其中MasterPageFile属性用于设置Default.aspx所绑定母版页的路径。另外,代码中还设置了一个 Content控件,它与母版页Default.master中的ContentPlaceHolder控件对应 (ContentPlaceHolderID="Main")。当页面执行时,ContentPlaceHolder所占位置将显示Content控件内 具体设置的内容。通过以上两个关键步骤,即可快速完成母版页应用。
通过本文的介绍,相信读者已经了解了母版页在PWS中的应用方法。利用母版页功能的确能够提高开发人员的工作效率。下面一篇文章介绍主题和登录控件应用。

