一、基于XML的站点地图
以前在Web应用程序中建立导航的方法是在页面上散布大量的超级链接。但当开发大型Web工程时,这种简单而原始的方法显得极为臃肿而且力不从心。 为此,ASP.NET 2.0引入了一个新的导航系统来解决整个问题。尽管ASP.NET中的这个新功能非常复杂,但是我们可以从其提供的大量方法属性对之进行全面控制。
这种新的导航系统通过一个XML文件来定义整个站点的导航系统;为此,该XML文件称为“站点地图”。在本文中,我们想略过有关这种基于XML的站 点地图的基本讨论(注:本文提供了两个示例工程,其中之一即是有关基于XML显示站点地图),而专注于讨论这种新的站点导航机制的本地化问题,并提供一个 简单但完整的示例工程。
通过修改资源文件(.resx)来实现系统的本地化,是实现从桌面应用到ASP.NET应用程序开发的本地化的一种好方法。下面,我们将详细讨论这种方法。
二、为本地化构建站点地图—Web.sitemap文件
可以把本地化指令应用于ASP.NET Web应用程序的页面上,也可以使用相同的思路在Web.sitemap文件中完成本地化任务。
右击“解决方案资源管理器→添加新项…”,在随后的“添加新项”对话框中点选“站点地图”模板,如下图所示:
图1.
通过点选“站点地图”模板创建站点地图文件
为此,我们应该先构建一个
Web.sitemap
文件,请见下面的程序清单:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns=" [url]http://schemas.microsoft.com/AspNet/SiteMap-File-1.0[/url]" enableLocalization="true"> <siteMapNode title="Home" description="Home" url="~/default.aspx" resourceKey="Home"> <siteMapNode title="Products" description="Our products" url="~/Products.aspx" resourceKey="Products"> <siteMapNode title="Hardware" description="Hardware choices" url="~/Hardware.aspx" resourceKey="Hardware"/> <siteMapNode title="Software" description="Software choices" url="~/Software.aspx" resourceKey="Software"/> </siteMapNode> <siteMapNode title="Services" description="Services we offer" url="~/Services.aspx" resourceKey="Services"> <siteMapNode title="Training" description="Training classes" url="~/Training.aspx" resourceKey="Training"/> <siteMapNode title="Consulting" description="Consulting services" url="~/Consulting.aspx" resourceKey="Consulting"/> <siteMapNode title="Support" description="Supports plans" url="~/Support.aspx" resourceKey="Support"/> </siteMapNode> </siteMapNode> </siteMap> |
这是一个相当简单的Web.sitemap文件。
【注意】尽管Web.sitemap文件可以引用其他站点地图提供程序或其他目录中的其他站点地图文件以及同一应用程序中的其他站点地图文件,但该文件必须位于应用程序的根目录中。
实现自定义的站点地图提供程序时,如果存储站点地图数据的文件的扩展名不是.sitemap,就会有潜在的安全风险。默认情况下,会将 ASP.NET配置为阻止客户端下载具有已知文件扩展名(如.sitemap)的文件。为帮助保护您的数据,可将文件扩展名不是.sitemap的所有自 定义站点地图数据文件放入App_Data文件夹中。
【注意】为了在Web.sitemap文件中支持本地化功能,必须使用元素中的enableLocalization属性—把它设置为true,以启动这项功能。接下来,你就可以使用元 素定义每个导航节点了。但在本文示例中,由于我们要通过各个独立的.resx文件来定义这些导航部分的内容(尤其是title和descriptioon 属性),所以我们不需要在这个文件中重复定义这些项。所以在此文件内,我们只需要定义url属性。但要注意,你还可以通过.resx文件来定义这个属性, 从而根据终端用户定义的文件设置,把他们定向到不同的页面上。
另一个要注意的属性是元素中使用的resourceKey,它是各个.resx文件中使用和定义的键。以下面的元素为例:
<siteMapNode url=”News.aspx” resourceKey=”News”>
………… </siteMapNode> |
在这个例子中,resourceKey的值(和.resx文件中使用的键)都是News。这表示可以使用下面的语法在.resx文件中定义title和description属性的值:
News.Title
News.Description |
至此,我们已经准备好站点地图文件Web.sitemap。接下来,我们要对ASP.NET 2.0配置文件Web.config进行一些小小的修改。
三、修改文件Web.config
为了让Web应用程序自动检测和查看各个页面的用户所使用的文件设置,我们需要在文件的@Page指令中设置Culture和UICulture属性,或者在Web.config文件中的元素中设置这些属性,以支持自动检测。
【提示】在处理导航和Web.sitemap文件时,最好在Web.config文件中进行这些修改,使它们在应用程序的每个项目上自动发挥作用。这么做也比较简单,因为不需要给每个页面添加这些修改。
要进行这样的修改,只需打开Web.config文件并添加一个元素,如下面的清单所示。
<configuration>
<system> <globalization culture=”auto” uiCulture=”auto” /> <system> <configuration> |
为了支持自动检测功能,只需把culture和uiCulture属性设置为auto。还可以把其值定义为auto:en-US,它表示支持自动化 检测功能,但如果所定义的文件在各个资源文件中未找到,就把en-US用作默认文件。但在本例中,因为我们要定义一组Web.sitemap默认值,所以 不需要进行这样做。
接下来,我们需要创建程序集资源文件,以定义Web.sitemap文件使用的值。
四、创建程序集资源文件
要创建一组用于Web.sitemap文件的程序集资源文件,应在项目中创建一个文件夹App_GlobalResources。
【提示】如果你使用的是Visual Studio 2005,则只需要右击项目,然后选择“Add Folder→App_GlobalResources.Folder”即可添加这个文件夹。
添加了App_GlobalResources文件夹后,下一步是给这个文件夹添加两个程序集资源文件:第一个文件命名为 Web.sitemap.resx;第二个文件命名为Web.sitemap.en.resx。其中,Web.sitemap.resx文件包含一组在 Web.sitemap.resx文件中定义的用于Web.sitemap文件中的默认值,而Web.sitemap.en.resx文件包含了相应于这 些值的英语版本。
文件名中有en值,表示该文件由把首选语言设置为en-EN的用户使用。这些设置的其它值如表所示。
文件名中有en值,表示该文件由把首选语言设置为en-EN的用户使用。这些设置的其它值如表所示。
.resx
文件
|
对应的文件
|
Web.sitemap.resx
|
如果终端用户的文件不能通过另一个.resx文件来识别,则使用默认值
|
Web.sitemap.en.resx
|
用于所有英语用户的资源文件
|
Web.sitemap.en-gb.resx
|
用于所有英国英语用户的资源文件
|
Web.sitemap.fr-ca.resx
|
用于所有加拿大法语用户的资源文件
|
Web.sitemap.ru.resx
|
用于所有俄语用户的资源文件
|
有了Web.sitemap.resx文件和Web.sitemap.en.resx文件之后,下面就是给这些文件相应的属性值赋予特定的文化值。为此,我们使用前面在Web.sitemap文件中定义的键,如下图2所示。
图2.中文站点资源文件(Web.sitemap.resx)相应的键定义
图3.英文站点资源文件(Web.sitemap.en.resx)相应的键定义
有了这些文件后,我们就可以进行本地化测试。
五、本地化测试
在VS2005新建一个ASP.NET网站项目,然后把一个TreeView服务器控件拖动到默认Web页面 (Default.aspx)上。除了这个TreeView控件之外,还要放置一个SiteMapDataSource控件,以配合前面所创建的 Web.sitemap文件之用。然后,设置TreeView控件的属性DataSourceID为SiteMapDataSource1—这样以来,可 以将这两个控件关联起来。
在浏览器中一打开这个页面时,它就会检查请求的首选文化。由于本例中定义的设置是用于使用简体中文的用户,所以使用默认的Web.sitemap.resx文件。于是,系统使用Web.sitemap.resx文件填充TreeView控件的值,如下图所示。
图4.使用简体中文语言时的站点地图显示内容
如果用户把文化设置为en(英语),就会得到完全不同的结果。为此,打开IE菜单“工具→Internet选项→常规→语言→语言首选项”,然后单击‘添加’按钮,在选项列表中添加‘en’语言设置。
注意,因为IE自动使用优先级方法确定显示网页语言;所以,添加该语言后,你还需要使用“上移”按钮,把新添加的语言置到最上面,见下图。
图5.添加英语语言并置之为最优先的文化选择
点击“确定”退出对话框,刷新IE页面,则结果将如下图所示:
图6.使用英语语言时的站点地图显示内容
现在,请求页面时,文件设置为en,对应于站点资源文件Web.sitemap.en.resx,而不是默认的Web.sitemap.resx文件。
【调试问题】在调试过程中,我发现当点击上面树控件中的‘折叠’(或‘展开’)按钮时,出现下图中所示异常显示(对于中文也是如此):
【调试问题】在调试过程中,我发现当点击上面树控件中的‘折叠’(或‘展开’)按钮时,出现下图中所示异常显示(对于中文也是如此):
图7.IE显示异常
但到目前为止,本文尚未找到相应的解决办法。如有找到此答案者,请不吝赐教。
六、小结
本文中,我们首先简要地介绍了ASP.NET 2.0提供的新的站点导航机制,并注意到这个新的导航功能的核心是通过XML文件来详细描述网站的导航框架。显然,这种新导航机制的强大功能可以大大节省 程序员的编码时间。接下来,我们通过一个简单的例子分析了本地化Web.sitemap的一般思路。