在ASP.NET2.0中建立站点导航层次(4)

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

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

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

Web.sitemap的内容

以下是引用片段:
<?xmlversion="1.0"encoding="utf-8"?>  
<siteMapxmlns=""enableLocalization="true">  
<siteMapNodeurl="~/Default.ASPx"title="$resources:Title,MyTitle,Home"description="Defaultpagedescriptionwhennolocalizedvalueexists.">  
<siteMapNodeurl="~/Category.ASPx"resourceKey="Category">  
<siteMapNodetitle="Autos"description="Autos"url="~/Autos.ASPx"resourceKey="Autos"/>  
<siteMapNodetitle="Games"description="Games"url="~/Games.ASPx"resourceKey="Games"/>  
<siteMapNodetitle="Health"description="Health"url="~/Health.ASPx"resourceKey="Health"/>  
<siteMapNodetitle="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控件会被更新并反映第二次点击的链接。

以下是引用片段:
PublicClassPathExpansionHandler 
PublicSharedFunctionExpandPath(ByValsenderAsObject,ByValeAsSiteMapResolveEventArgs)AsSiteMapNode 
'获取当前和之前节点的引用 
DimnodeCopyAsSiteMapNode=SiteMap.CurrentNode.Clone(True)  
DimtempNodeAsSiteMapNode=nodeCopy  

'Checkifthereisanewsgrouptypeinthequerystring 
DimtypeIDAsString=Nothing  
DimtypeIDUrlEncodedAsString=Nothing  
IfNotString.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")) 
EndIf 

'首先执行发布页面URL的固定 
'如果查询字符串中包含发布ID,我们就知道当前节点式发布页面 
IfNotString.IsNullOrEmpty(e.Context.Request.QueryString("postingID"))Then 
DimpostingIDasstring=_ 
e.Context.Server.HtmlEncode(e.Context.Request.QueryString("postingID")) 
DimpostingIDUrlEncodedasstring=_ 
e.Context.Server.UrlEncode(e.Context.Request.QueryString("postingID")) 
DimNewUrlAsString=tempNode.Url+"?type="+typeIDUrlEncoded+"&postingID="+postingIDUrlEncoded  
DimNewTitleAsString=tempNode.Title+":"+postingID  
tempNode.Url=NewUrl 
tempNode.Title=NewTitle 

tempNode=tempNode.ParentNode 
EndIf 

'然后,对新闻组页面进行固定 
'这时候nodeCopy变量知贤了新闻组节点 
IfNotString.IsNullOrEmpty(e.Context.Request.QueryString("type"))Then 
DimNewUrlAsString=tempNode.Url+"?type="+typeIDUrlEncoded  
DimNewTitleAsString=tempNode.Title+":"+typeID  
tempNode.Url=NewUrl 
tempNode.Title=NewTitle 
EndIf 

'最后返回当前节点 
ReturnnodeCopy 
EndFunction 
EndClass 

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值