silverlight之deeplink学习笔记

所谓的deeplink技术是为了解决silverlight(或flash)之类的RIA Web应用无法被搜索引擎收录而出现的,属于SEO范畴。

就拿最常见的企业网站为例,里面有企业简介(About),产品展示(Product),联系我们(AboutUs)...等常见模块,如果全站都用silverlight/flash来做,default.html页面上用object嵌入一个xap/swf就完事了,搜索引擎永远收录到的都是default.html一个页面.

假如,我们能用 http://www.xxx.com/default.html#/About 能让silverlight切换到企业简介(About)场景,能用".../default.html#/Product” 切换到产品展示模块,能用"../default.html#/Product?id=123" 切换到id=123的产品,这样对于搜索引擎就非常友好了,它会认为这是不同的url,从而能收录更多的页面。

幸好,silverlight 3中要实现这一点非常容易(SL的设计者们确实想得很周到)

vs2008中新建(new)一个项目(Project)时,不知道大家有没注意到“Silverlight导航应用程序”这种类型,建一个试试看

 

F5编译运行看看,注意浏览器地址栏

可以发现自动变成了类似 http://localhost:19341/slNavTestPage.aspx#/Home ,页面标题自动变成了"主页",再点击About按钮,地址栏变成了 http://localhost:19341/slNavTestPage.aspx#/About ,页面标题自动变成了"关于",而我们还一行代码都没写,这不正是我们想要的吗?

如果我们想自己手动达到这种效果,也不困难,新建一个Index.xaml的控件(或页面),内容如下:

 

<UserControl x:Class="slNav.Index"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation" 
    >

    <StackPanel Orientation="Vertical">

        <navigation:Frame x:Name="ContentFrame"  Source="/Home" NavigationFailed="ContentFrame_NavigationFailed" Height="300" Navigated="ContentFrame_Navigated">
            <navigation:Frame.UriMapper>
                <uriMapper:UriMapper>
                    <uriMapper:UriMapping Uri="" MappedUri="/Views/Home.xaml"/>
                    <uriMapper:UriMapping Uri="/{pageName}" MappedUri="/Views/{pageName}.xaml"/>
                </uriMapper:UriMapper>
            </navigation:Frame.UriMapper>
        </navigation:Frame>

        <TextBlock x:Name="xUri"></TextBlock>

    </StackPanel>

</UserControl>

关键在于<navigation:Frame>..</navigation:Frame>这个控件,它是一个容器,用于在各页之间跳转导航,同时自动会让地址栏产生刚才的变化.

有一个Source属性比较关键,可以用来指定导航显示的xaml页,比如你可以指定为"/pages/about.xaml",运行时它将加载/pages/about.xaml到容器中显示,但是可能有些人觉得这种太长了,而且也暴露了网站本身的目录结构,如果能用"/About" 直接显示"/Pages/About.xaml"多好,没问题!

注意上面的<uriMapper:UriMapper>..<uriMapper:UriMapper>,它提供了地址映射的能力!(很象urlRewriter功能)

<uriMapper:UriMapping Uri="/{pageName}" MappedUri="/Views/{pageName}.xaml"/>

表示地址 "/abc" 将自动映射到 "/Views/abc.xaml",地址"/About"将自动映射到"/Views/About.xaml"

定义了映射规则后,Source属性就可以把"/Views/Home.xaml"简写成"/Home"

这里有一点要注意,如果您定义多个映射关系,请合理安排顺序

比如:

<uriMapper:UriMapper>
         <uriMapper:UriMapping Uri="" MappedUri="/Views/Home.xaml"/>
         <uriMapper:UriMapping Uri="/Link/{id}" MappedUri="/Views/Link.xaml?id={id}"/>
         <uriMapper:UriMapping Uri="/{pageName}" MappedUri="/Views/{pageName}.xaml"/>                      
</uriMapper:UriMapper>

这是有效的,输入"..#/Link/3" 将自动映射到 "/Views/Link.xaml?id=3"

但是如果换一下顺序:

<uriMapper:UriMapper>
         <uriMapper:UriMapping Uri="" MappedUri="/Views/Home.xaml"/>
         <uriMapper:UriMapping Uri="/{pageName}" MappedUri="/Views/{pageName}.xaml"/>                    

         <uriMapper:UriMapping Uri="/Link/{id}" MappedUri="/Views/Link.xaml?id={id}"/>
</uriMapper:UriMapper>

这样是无效的,"..#/Link/3" 永远也得不到正确的映射!因为第二条红色的规则先匹配了,它将会把这个地址能识别的有效部分先翻译成 "/Views/Link.xaml",至于后面的"/3"它不认别,则会原样附加到后面,最终得到的地址是 "/Views/Link.xaml/3",因为/Views/下没有Link.xaml这个目录,所以当然会找不到路径而出错!

大概原则:特殊的规则写在前面,通用的规则写在后面

另一个问题,导航到类似"/Product?id=123"这种地址后,在silverlight中如何象Asp.net中的Request.QueryString那样接受参数呢?

可以在product.xaml.cs中类似如下处理:

 1
 2// 当用户导航到此页面时执行。
 3        protected override void OnNavigatedTo(NavigationEventArgs e)
 4        {
 5            IDictionary<string, string> _dicParm = this.NavigationContext.QueryString;
 6
 7            if (_dicParm.ContainsKey("id")) 
 8            {
 9                xParm.Text = "产品id = " + _dicParm["id"];
10            }            
11        }

 
要注意的是:参数名是区分大小写的,也就是说 /product/?id=123 跟 /product/ID=123是不一样的!(这点跟asp.net不同)

最后看一下标题的问题,观察一下Silverlight中Page页自动生成的xaml代码:

1<navigation:Page x:Class="slNav.Views.Link" 
2           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
3           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
4           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6           mc:Ignorable="d"
7           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
8           d:DesignWidth="640" d:DesignHeight="480"
9           Title="友情链接">

没错,就是Title属性!

那么运行时,silverlight是如何自动把xaml中的title设置到html/aspx网页标题的呢?

其实内部原理我也不知道,哈! 不过我经过多次测试发现,vs.net自动生成的测试页html代码中

<div id="silverlightControlHost">
        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
          <param name="source" value="ClientBin/slNav.xap"/>
          <param name="onError" value="onSilverlightError" />
          <param name="background" value="white" />
          <param name="minRuntimeVersion" value="3.0.40624.0" />
          <param name="autoUpgrade" value="true" />
          <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none">
               <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>
          </a>
        </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>

总是有一行<iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe>,如果你把这个去掉,虽然页面照样能显示,但是silverlight就没办法自动设置网页标题了,而且连这个iframe的id都不能变,估计是silverlight内部定死了。

更多细节,欢迎大家补充。

转载请注明出自菩提树下的杨过

 

时间: 2024-10-27 12:19:59

silverlight之deeplink学习笔记的相关文章

Silverlight数据绑定/IValueConverter学习笔记

先回忆一下aspx中的处理: 在aspx中,可以直接在后台定义一个变量,然后前台就可以用<%=xxx%>来将其"绑定"html控件上,比如下面这样,实在是很方便: 代码 using System; namespace WebApplication1{    public partial class _Default : System.Web.UI.Page    {        protected string _Test = DateTime.Now.ToString(

WPF + Silverlight学习笔记

WPF and Silverlight学习笔记(三十):Brush(2) WPF and Silverlight学习笔记(二十九):Brush(1) WPF and Silverlight学习笔记(二十八):基本图形的使用(3)图 WPF and Silverlight学习笔记(二十七):基本图形的使用(2)Pa WPF and Silverlight学习笔记(二十六):基本图形使用(1) WPF and Silverlight学习笔记(二十五) WPF and Silverlight学习笔记(

WPF and Silverlight学习笔记(二十五)

WPF and Silverlight学习笔记(二十五):使用CollectionView实现对绑定数据的排序.筛选.分组 在第二十三节,我们使用CollectionView实现了对于绑定数据的导航,除导 航功能外,还可以通过CollectionView对数据进行类似于DataView的排序.筛选 等功能. 一.数据的排序: 使用第二十四节的数据源,查询所有 的产品信息: 1: <Window x:Class="WPF_24.CollectionViewSortData" 2:

WPF and Silverlight学习笔记(十二)

WPF and Silverlight学习笔记(十二):WPF Panel内容模型.Decorator内容模型及其他 一.Panel内容模型 Panel内容模型指从 System.Windows.Controls.Panel继承的控件,这些控件都是容器,可以在内部 承载其他的控件和子容器.Panel内容模型包含的容器有: Canvas DockPanel Grid TabPanel ToolBarO verflowPanel UniformGrid StackPanel ToolBarPanel

WPF and Silverlight学习笔记(七)

WPF and Silverlight学习笔记(七):WPF布局管理之StackPanel.WrapPanel.DockPanel 一.StackPanel StackPanel是以堆叠的方式显示其中的控件 1 .可以使用Orientation属性更改堆叠的顺序 Orientation="Vertical" 默认,由上到下显示各控件 .控件在未定义的前提下,宽度为StackPanel的宽度,高度自动适应控件中内容 的高度 1: <StackPanel Orientation=&q

ArcGIS API for Silverlight学习笔记

ArcGIS API for Silverlight学习笔记(一):为什么要用Silverlight API(转) 你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我都没关系.但你不能否认3G是一种趋势,最终我们每个人都会 被包裹在3G网络中.1100也不是一成不变,没准哪天为了打击犯罪,会在你的1100上强制装上GPS.GIS工作既然建立在计算机的基础上,当然也得 随着IT行业与时俱进.       看看现在计算机应用的趋势吧.云(计算),这个东西可讲不清楚,因

Windows phone 8 学习笔记(4) 应用的启动

原文:Windows phone 8 学习笔记(4) 应用的启动 Windows phone 8 的应用除了可以直接从开始菜单以及应用列表中打开外,还可以通过其他的方式打开.照片中心.音乐+视频中心提供扩展支持应用从此启动.另外,我们还可以通过文件关联.URI关联的方式启动应用. 快速导航:     一.扩展音乐+视频中心     二.扩展照片中心     三.文件关联以及SD卡访问     四.URI关联     五.启动我的其他应用和启动内置应用 一.扩展音乐+视频中心 1)在音乐+视频中心

VSTO 学习笔记(十)Office 2010 Ribbon开发

原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个Ribbon中,便于集中管理.操作.这种Ribbon是高度可定制的,用户可以将自己常用的功能进行单独设置,提高工作效率.但是由于Office 2003时代用户的操作习惯已经养成,结果到了Office 2007很多菜单.按钮都找不到了,着实有些尴尬.经过一段时间的适应,相信大多数用户已经习惯Ribbon

Flash/Flex学习笔记(52):使用TweenLite

TweenLite是第三方出品的专用于各种缓动动画的类库,其性能据说已经超过了Adobe官方的Tween. 从网上找到了一篇中文的说明文档:http://files.cnblogs.com/yjmyzz/tweenLite%e4%b8%ad%e6%96%87%e6%89%8b%e5%86%8c%e4%b8%8e%e5%8f%82%e6%95%b0%e8%af%b4%e6%98%8e.pdf 这是官方的测试示例: AS3类库下载: http://files.cnblogs.com/yjmyzz/g