首页 > 编程 > .NET > 正文

在ASP.NET 2.0中建立站点导航层次(4)

2024-07-10 13:12:43
字体:
来源:转载
供稿:网友

  显式表达式使开发者对包含本地资源的文件和资源键(resource key)的名称有更强的控制能力。在示例web.sitemap中,第一个元素使用了显式资源表达式。显式表达式在每个属性上指定。第一个元素的title属性使用了显式表达式。显式表达式必须以$resource:开头。在这个标识符之后,开发者必须提供资源文件的根名称和资源键。开发者可以选择提供一个默认值。在例子中,表达式$resources: title, mytitle , home表明提供程序应该查看以"title"开头的资源文件。对于发送法语头信息的浏览器开说,提供程序会查找title.fr.resx资源文件。接下来提供程序查看键为mytitle的资源。如果提供程序无法找到这种资源,它会把字符串"home"作为默认值。

  你可以运行示例来查看站点地图本地化的效果。把英语作为默认语言的浏览器会显式英语文本。如果使用ie,你可以通过点击"工具->internet选项",并在"通用"选项卡点击"语言"按钮,点击"添加"按钮并选择添加"法语"。如果需要,还需要选中法语并点击"向上移动"按钮,使它成为ie的默认请求语言。把默认的语言改成法语之后,刷新示例页面。请注意,menu、treeview和sitemappath控件中的文本自动地显式为app_globalresources目录中存放的法语资源文件中的法语文本。

  web.sitemap的内容

  以下是引用片段:
<?xml version="1.0" encoding="utf-8" ?>  
<sitemap xmlns="http://schemas.microsoft.com/aspnet/sitemap-file-1.0" enablelocalization="true">  
<sitemapnode url="~/default.aspx" title=" $resources: title, mytitle , home" description="default page description when no localized value exists." >  
<sitemapnode url="~/category.aspx" resourcekey="category">  
<sitemapnode title="autos" description="autos" url="~/autos.aspx" resourcekey="autos" />  
<sitemapnode title="games" description="games" url="~/games.aspx" resourcekey="games" />  
<sitemapnode title="health" description="health" url="~/health.aspx" resourcekey="health" />  
<sitemapnode title="news" description="news" url="~/news.aspx" resourcekey="news" />  
</sitemapnode>  
</sitemapnode>  
</sitemap>  

  修改提供程序(provider)返回的站点导航数据

  存储在web.sitemap中、供xmlsitemapprovider使用的导航数据是静态的--这些数据被载入内存中并作为只读数据存储。但是,很多站点的导航结构是根据查询字符串的值来参数化的。例如,新闻组(newsgroup)站点可能拥有良好定义的页面结构(例如,主页、新闻类别页面和新闻内容页面),但是实际的内容可能会有很大的不同,这依赖于查询字符串中的标识符。尽管把每种可能的查询字符串值都存储在元素中也是可能的,但是即使是中等数量的查询字符串值,也要求sitemap文件包含数百个元素。

  站点导航特性在sitemapprovider基类中暴露了sitemapresolve事件。可以使用sitemap.sitemapresolve或直接使用提供程序sitemap.provider.sitemapresolve来执行这个事件。这个事件的返回值是一个sitemapnode实例。你可以在自己的事件处理程序中编写自定义逻辑来建立sitemapnode实例的层次结构。这个逻辑可以修改每个sitemapnode的属性,因此url和title等属性会反映查询字符串带有的数据信息。

  下面的例子在global.asax中注册了一个事件处理程序。这个事件处理程序的代码是app_code目录中的一个类。这个自定义的类复制与当前页面对应的sitemapnode实例。xmlsitemapprovider返回的节点都是只读的,而调用sitemapnode上的clone方法返回的是可写入的节点。在实例中,如果给clone传递了true值,将导致当前的sitemapnode和它的所有父节点都是可写入的。这个类的代码的其它部分检查当前的页面和当前页面的查询字符串,确定当前页面位于站点层次结构的什么位置。代码修改了url和title属性,包含一些额外的信息,这样sitemappath控件显示的导航ui就反映了网站用户为到达当前页面的实际点击路径。

  运行示例的时候,你开始位于站点的主页。sitemappath控件也反映了这一点。点击任何链接都会带你进入分类页面,它显示相关新闻类别中的新闻链接。请注意,如果你把鼠标停留在sitemappath控件的最后一个链接上,浏览器状态栏中显示的url包含了查询字符串信息(它指定了新闻类别)。点击任何一个发布链接都会把你带回到新闻发布页面。如果你把鼠标停留sitemappath控件的链接上,可以注意到控件中的最后两个链接带有的url和title包含了点击路径的正确查询字符串和描述信息。如果你导航到站点的主页,并点击其它的新闻组和内容链接,sitemappath控件会被更新并反映第二次点击的链接。

  以下是引用片段:

public class pathexpansionhandler 
public shared function expandpath(byval sender as object, byval e as sitemapresolveeventargs) as sitemapnode 

  '获取当前和之前节点的引用 
dim nodecopy as sitemapnode = sitemap.currentnode.clone(true)  
dim tempnode as sitemapnode = nodecopy  

'check if there is a newsgroup type in the query string 
dim typeid as string = nothing  
dim typeidurlencoded as string = nothing  
if not string.isnullorempty(e.context.request.querystring("type")) then 
typeid = e.context.server.htmlencode(e.context.request.querystring("type")) 
typeidurlencoded = e.context.server.urlencode(e.context.request.querystring("type")) 
end if 

  '首先执行发布页面url的固定 
  '如果查询字符串中包含发布id,我们就知道当前节点式发布页面 
if not string.isnullorempty(e.context.request.querystring("postingid")) then 
dim postingid as string = _ 
e.context.server.htmlencode(e.context.request.querystring("postingid")) 
dim postingidurlencoded as string = _ 
e.context.server.urlencode(e.context.request.querystring("postingid")) 
dim newurl as string = tempnode.url + "?type=" + typeidurlencoded + "&postingid=" + postingidurlencoded  
dim newtitle as string = tempnode.title + ": " + postingid  
tempnode.url = newurl 
tempnode.title = newtitle 

tempnode = tempnode.parentnode 
end if 

  '然后,对新闻组页面进行固定 
  '这时候nodecopy 变量知贤了新闻组节点 
if not string.isnullorempty(e.context.request.querystring("type")) then 
dim newurl as string = tempnode.url + "?type=" + typeidurlencoded  
dim newtitle as string = tempnode.title + ": " + typeid  
tempnode.url = newurl 
tempnode.title = newtitle 
end if 

  '最后返回当前节点 
return nodecopy 
end function 
end class 



收集最实用的网页特效代码!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表