南通最专业的开锁公司 南通最好的开锁公司 君威遥控器电池 君威专用汽车钥匙电池雷诺科雷傲汽车钥匙遥控器电池更换方法 南通开锁公司电话_南通修锁 换锁芯 开汽车锁 崇川区 港闸区 如皋 如东开锁 南通开锁公司电话 南通金钥匙开锁服务部-专业开修锁 换锁芯(正规公安工商备案) 南通开锁公司电话 南通开锁公司修锁 装锁电话|崇川区开锁|港闸区开锁 led吸顶灯光源 吸顶灯32w 吸顶灯 灯管 吸顶灯 节能灯泡 led吸顶灯灯泡 三头吸顶灯 led吸顶灯灯管 欧普圆形吸顶灯 55w吸顶灯 吸顶灯光源 旅游壶 真空保温 汉方养生壶 美的电热水壶15s08a2 半球牌电饭煲 美的 mg123-d hd2 飞科 三洋洗衣机全自动 新安怡 学饮杯 黑苦荞黄酮软胶囊 苦荞糖安胶囊 五彩凉山苦荞茶 苦荞茶250g 全胚芽黑苦荞茶500 内蒙特产苦荞茶 富贵康苦荞茶 苦荞面包邮 正中苦荞茶包邮 正中苦荞茶 包邮 苦荞香茶西部 苦荞香茶 西部 轩庆苦荞玫瑰鲜花饼 苦荞真空 苦荞500克 苦荞茶120 苦荞 真空 0.02安全套包邮0.2大力马鱼线0.4mm0.4鱼线0.5l氮纤维高压瓶007sh充电器007电子请柬00高达xn-raiser01102400018401背囊0-25微米千分尺03g101系列全套图集0-3个月婴儿连体哈衣05-08本田奥德赛05ffc23套机05版河南动感地带0603贴片电阻包06年款英派斯06斯巴鲁森林人cd机07军衔07军用水壶07款福克斯两厢07数码迷彩07速腾大灯总成 泰好大门锁 泰好豪华大门锁 cei超b级锁芯 玻璃橱门锁 指纹锁耶鲁4109 耶鲁凯特曼指纹锁 防盗挂锁包邮 包挂锁 包梁挂锁 新君威门锁 新君威门锁扣 指纹锁木门 太空铝黑色门锁 泰好浴室铜门锁 浴室门锁不锈钢 1178冷库门锁 南通配新桑塔纳2000 3000 时代超人 志俊汽车钥匙_配帕桑塔纳钥匙遥控器_帕萨特钥匙全丢重配崇川区 南通配宝来汽车钥匙_配宝来遥控器_宝来钥匙全丢如皋 南通配帕萨特汽车钥匙_配帕萨特遥控器_帕萨特钥匙全丢通州 南通配凯越汽车钥匙_配凯越遥控器_凯越钥匙全丢如东

  • 格子衬衣女 长袖 秋
  • t男恤 短袖 韩版包邮
  • 男士职业衬衫
  • 衬衫 女 长袖点点
  • 衬衫 素色 男 宽松 休闲
  • 职场气质衬衫女
  • t恤男短袖加大码不掉色
  • 帅T 小西装
  • 裤子棕色长裤男
  • 衬衣 女 灯芯绒
  • 衬衣 女商务
  • 女士职业衬衫短袖
  • 休闲裤 男 修身
  • jamesearl纯棉休闲长裤
  • 占姆士女式长袖衬衫
  • 男黑色商务休闲棉长裤
  • 女士长袖衬衫
  • 男士绿色休闲长裤
  • 全棉短袖衬衫 男 薄
  • 女士长袖纯棉衬衫
  • 秋裤男直筒
  • 马自达3汽车挂件吊坠饰品 高档琉璃汽车挂饰品蒙迪欧致胜汽车挂件吊坠饰品 高档琉璃汽车挂饰品 启辰D50汽车挂件吊坠饰品 高档琉璃汽车挂饰品起亚K2汽车挂件吊坠饰品 高档琉璃汽车挂饰品索纳塔汽车挂件吊坠饰品 高档琉璃汽车挂饰品天籁汽车挂件吊坠饰品 高档琉璃汽车挂饰品 天语SX4汽车挂件吊坠饰品 高档琉璃汽车挂饰品英朗GT汽车挂件吊坠饰品 高档琉璃汽车挂饰品英伦SC7汽车挂件吊坠饰品 高档琉璃汽车挂饰品自由舰汽车挂件吊坠饰品 高档琉璃汽车挂饰品雨燕汽车挂件吊坠饰品 高档琉璃汽车挂饰品雪佛兰迈锐宝汽车挂件吊坠饰品 高档琉璃汽车挂饰品

    秋冬季现代瑞纳 宝马5系 帕萨特 日产骐达专用汽车毛绒方向盘套 江苏省盐城市地图2014 最新版 江苏省卫星地图2014 最新版 百度地图-谷歌地图-中国地图-北京地图-搜狗地图google地图 广本凌派汽车座垫 凌派秋冬季汽车坐垫 四季通用 长安福特福克斯油耗详解 宝来汽车遥控钥匙电池 更换方法 图解宝来遥控钥匙的电池换法 宝骏630车钥匙遥控器电池更换步骤 更换方法 迈腾车钥匙电池 迈腾更换遥控器电池详解逍客汽车钥匙电池 遥控器逍客智能钥匙的电池更换步骤 新天籁智能遥控钥匙电池 新天籁智能钥匙如何更换纽扣电池 golf6 汽车钥匙遥控器换电池 图解高尔夫6遥控钥匙的电池换法 长安福特福克斯加速时间详解[图] 福克斯汽车钥匙电池 福克斯钥匙电池更换作业 Q5车钥匙更换电池方法 图解新凯越车钥匙更换电池
  • 汽车坐垫 可爱
  • wrc汽车坐垫
  • 汽车坐垫套四季通用
  • 明锐冰丝 汽车坐套
  • 骐达汽车脚垫全包围
  • 三菱蓝瑟汽车坐垫
  • 捷达汽车脚垫 3d
  • 奥迪S7坐垫
  • 别克荣御坐垫
  • Jeep指南者坐垫
  • 力帆320坐垫
  • 路虎卫士坐垫
  • 双龙爱腾坐垫
  • 斯柯达Yeti坐垫
  • 现代途胜坐垫
  • 一汽威乐坐垫
  • 哈飞路宝汽车坐垫
  • 吉利远景汽车坐垫
  • 吉利全球鹰汽车坐垫
  • 房门锁执手锁 防盗挂锁
  • 运动短裤
  • 短裤 男
  • 半裙
  • 手工拖鞋鞋底
  • iphone4皮套 手机套
  • 机油滤清器扳手工具
  • 桑塔纳3000机油
  • 家居摆件现代
  • 玻璃摆件
  • 瓷器摆件
  • 马到成功摆件
  • 高档瓷器摆件
  • 宝马山地自行车包邮
  • 根雕工艺品摆件
  • 家居摆件吊脚娃娃
  • 泰国佛像摆件工艺品
  • 美利达儿童自行车
  • 天鹅摆件结婚
  • 龙龟摆件纯铜
  • 金摆件聚宝盆
  • 亲子自行车 女式
  • 客厅卧室装饰摆件
  • 贵宾狗摆件
  • 木摆件
  • 羚羊头摆件
  • 招财兔摆件
  • 自行车前包
  • 牛仔短裤
  • 短裤 男 休闲
  • 高腰短裤
  • 夏季短裤
  • 蕾丝短裤
  • 连体短裤
  • 裙裤
  • 裤裙
  • 拖鞋 海外
  • 拖鞋 浴室
  • 拖鞋 防滑
  • 拖 鞋 男
  • 拖鞋 女
  • 浴室拖鞋
  • 家居拖鞋
  • 凉拖鞋
  • 夏天拖鞋
  • 香菇丸
  • 韩国饮料
  • 打草绳小松打草绳二手挖掘机小松 小松割灌机配件 钢木书桌办公桌钢木桌玻璃杯子水壶钢化玻璃水壶钢木办公桌钢木电脑桌进口玻璃水壶玻璃水成份防冻玻璃水包邮防冻玻璃水车用 环保果皮箱环保垃圾袋环保垃圾桶小松120-6常州小松割草机小松打草头小松割灌机小松割灌机配件 咖啡厅员工制服_咖啡厅服务员制服_西餐咖啡服务员制服_咖啡馆制服_咖啡店西餐
  • 5号充电电池8节套装
  • 5-7号电池充电器
  • 充电电池5号正品
  • 可充电电池5号
  • 7号充电电池批发
  • 7号电池包邮
  • 1.5v充电电池5号
  • 5号充电器电池免邮
  • 双鹿电池5号正品
  • 双鹿9v电池
  • 双鹿电池批发
  • 双鹿7号电池
  • 双鹿1号电池
  • 双鹿碱性电池
  • 三星s4电池原装正品
  • 三星s4原装电池后盖
  • n7100原装电池
  • 小米2s原装电池
  • galaxy s4大容量电池
  • galaxy s4原装电池
  • galaxy s3电池
  • galaxy nexus电池
  • 三星galaxy s4电池后盖
  • 品胜小米2s电池
  • 品胜手机电池
  • 小米2a电池品胜
  • 背夹电池iphone4s
  • note2背夹电池
  • 三星s4背夹电池皮套
  • 自行车fixedgear 自行车眼镜 近视 婴儿推车小自行车 自行车骑行眼镜风镜 钻石自行车 山地自行车立管 led自行车气嘴专用灯 三鼎自行车坐椅儿童 自行车线管 金镶玉玉器挂件 自行车脚踏双轴承 铬钼钢架自行车 邦德自行车女式 山地公路自行车 自行车骑行手电筒 自行车灯架 灯夹包邮 自行车水壶支架 自行车 组装 mosso 自行车载mp3 26自行车 男生单车 自行车 折叠 复古 giant山地车 自行车 炫彩自行车 七彩马亲子自行车 ucc山地车 自行车 贝嘉琦 女孩自行车 zxc自行车配件码表 自行车前置安全椅 女童自行车 小龙哈比 自行车碳纤维垫圈 自行车骑行用品 装饰木板板材 美式壁挂装饰 家具装饰配件 衣服装饰亮片 婚礼礼品实用 公司开业庆典礼品 婴儿衣柜 儿童欧式公主床 床围栏护栏嵌入式 床靠背套 派克圆珠笔芯 卧室台灯床头灯现代 个性笔袋 派克im签字笔 彩色铅笔包邮 派克宝珠笔芯 派克笔芯正品 百乐摩可擦笔笔芯 斑马油笔 微型钢笔钓鱼竿 电子教鞭遥控笔 镭射灯激光笔 彩色水笔芯 黑色水笔笔芯 公爵宝珠笔芯 touch3代马克笔 韩国文具笔包邮 水溶性彩色铅笔 马可 sgp触控笔 礼品创意笔筒 铂金 项链 pt950 男 老竹笔筒 竹雕笔筒 六福珠宝铂金手镯 8.9寸笔记本电脑 三菱签字笔1.0 华硕游戏笔记本 插座面板

    Silverlight 4+RIA Services–搜索引擎优化(SEO)

    继续我们的系列文章,接着来看一下Silverlight和SEO。互联网上大部分流量都是搜索驱动的。搜索引擎通常是很多用户在公共互联网上的第 一站,企业环境上的情况也在朝这个趋势发展。搜索也是很多广告获得收益的关键因素。所以无须多讲,SEO非常重要。但对于Silverlight程序来 说,很多有意思的内容都是动态生成的,怎么做SEO呢?接下来我会给大家展示一个只需耗费最小工作的应用模式来实现Silverlight应用程序的 SEO优化。

    要实现Silverlight应用程序的SEO优化,需要按照以下三个有趣而又简单的步骤来实施:

    • 步骤1:做好重要的页面的深层链接
    • 步骤2:使用网站地图(Sitemap)让搜索引擎知道你网站的所有深层链接
    • 步骤3:对于重要内容,提供一个备选版本

    下面我会用例子来讲解以上这三个步骤的具体含义。我会继续沿用我在PDC209上的“美食浏览器”的演示。你可能需要看一下我之前的演示(PDC09 Talk: Building Amazing Business Applications with Silverlight 4, RIA Services and Visual Studio 2010),这样可以在正式开始下面的讲解之前,能够熟悉一些背景。

    下载完整的示例

    步骤1: 做好重要的页面的深层链接

    对 于你网站上的任何内容,如果你想让搜索引擎能够爬取到,那么必须给这份内容起一个独特的Url。例如如果我想在Bing(或者Google,或者其他搜索 引擎)上搜索“乡村炸牛排(Country Fried Steak)”,能看到我网站上这个列举了很多乡村炸牛排图片的页面,那么我需要为这个页面提供一个Url,从而引导你来到这个页面。 http://foo.com/foodieExplorer.aspx这个Url还不够好,我需要提供一个类似于http://foo.com /foodieExplorer.aspx?food=CountryFriedsteak这样的Url。注意,使用这种格式的Url还有很多其他的好 处,例如用户可以在Twitter上传播,通过电子邮件或者即时通讯软件去讨论这些内容。

    幸运的是,Silverlight的导航特性使到实现内容的深层链接变得非常简单。我们来看看具体是怎么做的。

    clip_image001[6]

    我 们首先需要做的就是提供一个Url来唯一标识一个特定的餐馆,或者一个特定的餐馆加特定的美食。出于SEO或者用户友好的角度考虑,我们希望Url的格式 类似于http://www.hanselman.com/abrams/restaurant/25/plate/4,这表示餐馆编号=25,美食编 号=4。要实现这个,我们需要在Web工程的global.aspx文件中定义导航路径(Routes)。

    public class Global : HttpApplication {     void Application_Start(object sender, EventArgs e)     {         RegisterRoutes(RouteTable.Routes);     }      void RegisterRoutes(RouteCollection routes)     {         routes.MapPageRoute(             "deepLinkRouteFull",             "restaurant/{restaurantId}/plate/{plateId}",             "~/default.aspx",             false,             new RouteValueDictionary { { "restaurant", "-1" },             { "plate", "-1" } });          routes.MapPageRoute(             "deepLinkRoute",             "restaurant/{restaurantId}",             "~/default.aspx",             false,             new RouteValueDictionary { { "restaurant", "-1" } });

    在上面代码中,我们定义了深层链接的Url模板,支持Url中添加餐馆编号(restaurantId)和美食编号(plateId)的参数。我们定义的导航路径的顺序是从最复杂到不那么复杂。如果这两个编号在Url中都缺失的话,那么将使用上面设置的默认值。

    现在,我们来看看Silverlight客户端怎么解析这个Url的。在Plates.xaml.cs文件中:

    // Executes when the user navigates to this page. protected override void OnNavigatedTo(NavigationEventArgs e) {     int plateID = -1;     int restaurantId  =-1;     var s = HtmlPage.Document.DocumentUri.ToString().Split(new char[] {'/','#'});     int i = Find(s, "plate");     if (i != -1)     {          plateID = Convert.ToInt32(s[i + 1]);          plateDomainDataSource.FilterDescriptors.Add(              new FilterDescriptor("ID",                  FilterOperator.IsEqualTo, plateID));     }     i = Find(s, "restaurant");     if (i != -1) restaurantId = Convert.ToInt32(s[i + 1]);     else restaurantId = Convert.ToInt32(NavigationContext.QueryString["restaurantId"]);     plateDomainDataSource.QueryParameters.Add(         new Parameter()         {            ParameterName = "resId",            Value = restaurantId         }     ); }

    基本上,上面代码所做的事情就是获取完整的Url,然后将其结构化,再提取出其中的餐馆编号和美食编号。在18-23行中,我们将餐 馆编号作为参数传给查询方法,但是在11-14行中,我们并没有这么干,而是应用了一个过滤器,这就相当于最终发给服务器的LINQ查询就多了一个 “where”子句。这样,我们就无需修改服务端的代码了。

    我们还需要做一点小工作,那就是保证客户端最终导航到美食(Plates)的页 面。这在Silverlight的导航框架中是通过锚点“#/Plates”来实现的。但由于锚点只是一个客户端特性,而搜索引擎并不能很好的处理锚点, 因此我们需要在客户端动态添加锚点。我发现用一点点Javascript脚本就可以很好的完成这个工作。我在服务端的Default.aspx页面上加入 了这段脚本:

    protected void Page_Init(object sender, EventArgs e) {     string resId = Page.RouteData.Values["restaurant"] as string;     if (resId != null) { Response.Write("<script type=text/javascript>window.location.hash='#/Plates';</script"+">"); } }

    还有一个小事情需要注意的,由于我们启用了路径导航的功能,现在就可以通过不同的Url来访问default.aspx页面了,因此 如果使用相对路径去引用Silverlight.js以及MyApp.xap包的时候就会出现问题。例如我们会看到浏览器去请求 http://www.hanselman.com/abrams/restaurant/25/plate/4/Silverlight.js,而不是 http://www.hanselman.com/abrams/silverlight.js,这会导致下面错误:

    clip_image001[8]

    行: 56

    错误: Unhandled Error in Silverlight Application

    异常代码: 2104

    类别: InitializeError

    消息: 无法下载Silverlight程序,请检查Web服务器的设置

    要解决这个问题,我们需要修改脚本的src属性:

    <script src='<%= this.ResolveUrl("~/Silverlight.js") %>'

    还有Silverlight插件参数:

    <param name="source" value="<%= this.ResolveUrl("~/ClientBin/MyApp.xap") %>"/>

    现在我们再通过http://localhost:30045/restaurant/48/plate/119#/Plates这个包含美食编号的Url来访问,就能直接来到相应的美食页面了:

    clip_image001[10]

    步骤2:使用网站地图让搜索引擎知道你网站的所有深层链接

    现 在我们有了一个已经做好深层链接的应用程序了,每一个有趣的内容都被赋予了一个唯一的Url。但搜索引擎怎么知道这些Url呢?我们当然希望别人在社交网 络上多谈论(谈论的时候通常会留下链接),然后搜索引擎能够发现其中的一部分Url,但我们更希望能够把这事做完整了。我们想给搜索引擎提供一个应用程序 内部所有深层链接的Url列表。这可以使用网站地图(Sitemap)来实现。

    网站地图的格式是所有主流搜索引擎都认可的。你可以在http://sitemap.org网站找到相关的信息。

    为了更好的了解这其中的原理,我们来看看亚马逊,http://amazon.com,这个以数据驱动的网站是如何被搜索引擎索引的。当搜索引擎第一次来到这个网站,它会去读取网站根目录下的robots.txt文件。在这个例子中,robots.txt文件的绝对地址是http://www.amazon.com/robots.txt

    clip_image001[12]

    在这个例子中,我们可以看到,文件上半部分列举了一些目录,这些目录是不允许搜索引擎爬取的,文件下半部分列举的sitemap清单,是希望搜索引擎去爬取这些网站内容。

    注意,严格来说,你不是必须使用Robots文件来声明你的网站地图(译者注:原文写的是“你不是必须使用网站地图”)。你可以使用主流搜索引擎提供的网站管理员工具直接登记网站地图地址。

    如果我们导航到上面其中一个网址,我们将看到一个网站地图文件,如下面所示:

    clip_image001[14]

    在这个例子中,因为亚马逊网站很庞大,这些链接被放到多个网站地图中去了(上面这个文件被称为网站地图索引文件)。当我们钻进子网站地图文件中,就能看到实际产品的链接了。

    clip_image001[16]

    格式就如你看到的:

    <urlset xmlns="http://www.google.com/schemas/sitemap/0.84"> <url>   <loc>http://www.amazon.com/GAITHER-COMMITTEE-EISENHOWER-COLD-WAR/dp/081425005X</loc> </url> <url>   <loc>http://www.amazon.com/CONTROLLING-VICE-REGULATING-PROSTITUTION-CRIMINAL/dp/0814250076</loc> </url>

    有意思的是,当亚马逊产品目录中添加或者移除商品的时候,这里的链接也会经常发生变更。

    我们接着来看看如何为我们的网站建立一个网站地图。在Web工程中,打开VS的添加条目对话框,往我们工程添加一个“Search sitemap”  。

    clip_image002

    确认你机器上已经安装了RIA Services Toolkit ,否则是没有这个条目模板的。

    添加成功之后,我们会得到一个robots.txt文件:

    # This file provides hints and instructions to search engine crawlers.

    # For more information, see http://www.robotstxt.org/.

    # Allow all

    User-agent: *

    # Prevent crawlers from indexing static resources (images, XAPs, etc)

    Disallow: /ClientBin/

    # Register your sitemap(s) here.

    Sitemap: /Sitemap.aspx

    还有一个sitemap.aspx的文件。

    更多信息,请参考:Uncovering web-based treasure with Sitemaps

    但 这个sitemap.aspx文件还是空的,要建立实际可用的网站地图,我们需要基于PlateViewDomainService创建另外的视图。在这 个例子,这个视图的消费者是一个Asp.Net页面。这里我们要用到asp:DomainDataSource。在设计器拖放一个Repeater控件到 表单中,如下所示:

    clip_image003

    在Repeater控件上右键配置数据源:

    clip_image004

    选择一个数据源

    clip_image005

    clip_image006

    clip_image007

    最后,我们的网站地图文件中就会得到两个链接集合。

     <asp:DomainDataSource runat="server" ID="RestaurauntSitemapDataSource"  DomainServiceTypeName="MyApp.Web.DishViewDomainService"  QueryName="GetRestaurants" />  <asp:Repeater runat="server" id="repeater" DataSourceID="RestaurauntSitemapDataSource" >  <HeaderTemplate>  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">  </HeaderTemplate>  <ItemTemplate>  <url>  <loc><%= Request.Url.AbsoluteUri.ToLower().Replace("sitemap.aspx",string.Empty) + "restaurant/"%><%# HttpUtility.UrlEncode(Eval("ID").ToString()) %></loc>  </url>  </ItemTemplate>  </asp:Repeater>  <asp:DomainDataSource ID="PlatesSitemapDataSource" runat="server"  DomainServiceTypeName="MyApp.Web.DishViewDomainService"  QueryName="GetPlates">  </asp:DomainDataSource>  <asp:Repeater runat="server" id="repeater2" DataSourceID="PlatesSitemapDataSource">  <ItemTemplate>  <url>  <loc><%= Request.Url.AbsoluteUri.ToLower().Replace("sitemap.aspx",string.Empty) + "restaurant/"%><%# HttpUtility.UrlEncode(Eval("RestaurantID").ToString()) + "/plate/" + HttpUtility.UrlEncode(Eval("ID").ToString()) %></loc>  </url>  </ItemTemplate>  <FooterTemplate>  </urlset>  </FooterTemplate>  </asp:Repeater>

    在第3行和第20行,我们是直接调用在DomainService中定义的GetRestaurant 和GetPlates方法。

    现在,对于一个具有相当规模数据量的网站来说,这个页面将会耗费很长的时间去执行。它需要扫描数据库中的每一行。这当然可以保证数据永远最新的,但是我们希望平衡一下服务器的负载。一个简单的做法就是通过设置一个小时的输出缓存。具体操作参考ASP.NET Caching: Techniques and Best Practices

    <%@ OutputCache Duration="3600" VaryByParam="None" %>

    另外一个处理这种大数据集的策略是将数据分割到多个网站地图中去,就像我们上面看到的亚马逊网站的例子。

    clip_image008

    随便取其中的一个Url,导航到此网址,OK,现在我们得到正确的页面了。

    clip_image009

    步骤3:对于重要内容,提供一个备选版本

    太棒了,现在我们有了深层链接,我们也能让搜索引擎发现所有这些链接,不过,当搜索引擎来到这个页面的时候,它会看到什么?多数搜索引擎只会解析HTML,所以通过菜单"页面>查看源代码",我们就能够看到搜索引擎眼中我们页面的面目了:

    clip_image001[18]

    或者我们在禁用Silverlight插件(工具 > 管理加载项)后去访问此页面,我们会看到:

    clip_image001[20]

    我们会看到一个巨大的白屏!

    Silverlight 生成的动态内容根本没有显示。事实上,要显示这些动态内容,必须得执行Silverlight代码。但我敢肯定,搜索引擎在任何时候都不会在他们的数据中 心上去执行我们的Silverlight(或者Flash或者Ajax)代码的。所以我们需要的是一些备选的内容。

    幸运的是,要做到这一点非常简单。首先让所有备选的内容展示出来。需要特别注意的是,这些内容并不单单是给搜索引擎看。制作只给搜索引擎看的内容是“糊弄搜索引擎”,或者是垃圾网页。这些内容通常用来迷惑搜索引擎,掩盖网站的真实内容(the pernicious perfidy of page-level web spam) 。而这里的备选内容是给那些没有安装Silverlight插件的用户看的。它可能不拥有所有Silverlight的特性,但却提供了一个降级的用户体 验。当搜索引擎蜘蛛没有安装Silverlight插件的时候也是如此,这可以保证它们能够索引到一些有意义而且准确的信息。

    把下面这段HTML代码添加到default.aspx页面中。

    <div id="AlternativeContent" style="display: none;"> <h2>Hi, this is my alternative content</h2> </div>

    注意,这里写的是display:none,意味着我们并不期望浏览器去渲染这段内容...除非Silverlight插件不可用。为了实现这个效果,把下面这小段JS代码添加到页面中:

    <script type="text/javascript"> if (!isSilverlightInstalled()) { var obj = document.getElementById('AlternativeContent'); obj.style.display = ""; } </script>

    注意,这个很方便的isSilverlightInsalled函数是从Petr的old-but-good post on the subject文章中找到的。我只是把这个函数添加到我的Silverlight.js文件而已。

    function isSilverlightInstalled() {     var isSilverlightInstalled = false;     try {         //check on IE         try {             var slControl = new ActiveXObject('AgControl.AgControl');             isSilverlightInstalled = true;         }         catch (e) {             //either not installed or not IE. Check Firefox             if (navigator.plugins["Silverlight Plug-In"]) {                 isSilverlightInstalled = true;             }         }     }     catch (e) {         //we don't want to leak exceptions. However, you may          //to add exception tracking code here     }     return isSilverlightInstalled; }

    当我们使用一个没有启用Silverlight插件的浏览器中去浏览此页面的时候,我们就会看到备选的内容:

    clip_image002[5]

    但是如果安装了Silverlight,我们则会看到漂亮的Silverlight应用程序内容:

    clip_image003[5]

    这 很不错,但我们怎么让页面显示正确的内容呢?我们想要展示和Silverlight应用程序完全一致的数据,而且又不想写太多代码。我们也实在不想去维护 太多页面。所以让我们在页面的AlternativeContent这个DIV里头加入一些基本的代码。这个ListView是用来显示餐馆详细信息的。

    <asp:ListView ID="RestaurnatDetails" runat="server"                 EnableViewState="false">    <LayoutTemplate>        <asp:PlaceHolder ID="ItemPlaceHolder" runat="server"/>    </LayoutTemplate>    <ItemTemplate>        <asp:DynamicEntity ID="RestaurnatEntity" runat="server"/>    </ItemTemplate> </asp:ListView>

    现在我们需要把它和我们的数据源绑定...我发现在VS的设计视图里头很容易就能够做到这一点。注意,要在设计器中编辑这个DIV,你需要将DIV改成可见模式。

    clip_image004[5]

    然后我们来配置一下数据源:

    clip_image005[5]

    下一步,我们需要基于我们之前定义的导航路径来绑定查询参数。

    clip_image006[5]

    然后,我们对美食的ListView控件也重复同样的操作...

    现在我们得到的代码非常简单:

    <asp:ListView ID="RestaurnatDetails" runat="server"          EnableViewState="false" DataSourceID="restaurantsDomainDataSource"> <LayoutTemplate>       <asp:PlaceHolder ID="ItemPlaceHolder" runat="server"/> </LayoutTemplate> <ItemTemplate>      <asp:DynamicEntity ID="RestaurnatEntity" runat="server"/> </ItemTemplate> </asp:ListView>  <asp:DomainDataSource ID="restaurantsDomainDataSource" runat="server"                DomainServiceTypeName="MyApp.Web.DishViewDomainService"                QueryName="GetRestaurant"> <QueryParameters>   <asp:RouteParameter name="id" RouteKey="restaurantId"                    DefaultValue ="-1" Type = "Int32"/> </QueryParameters> </asp:DomainDataSource>

    下一步,我们需要让这些控件基于数据动态生成UI。

    protected void Page_Init(object sender, EventArgs e) {  RestaurnatDetails.EnableDynamicData(typeof(MyApp.Web.Restaurant));  PlateDetails.EnableDynamicData(typeof(MyApp.Web.Plate));  string resId = Page.RouteData.Values["restaurant"] as string;  if (resId != null) { Response.Write("<script type=text/javascript>window.location.hash='#/Plates';</script"+">"); } }

    注意到,我们在第4-5行处为这两个ListView控件启用了动态数据。

    最后一步,我们需要添加DynamicData需要用到的模板集。你可以从任何DynamicData的工程中获得相应的文件。将其拷贝到Web工程根目录下。

    clip_image007[5]

    你可以通过编辑这些模板来控制数据的显示。

    在EntityTemplates目录中,我们需要为每个实体创建一个实体模板(在这个例子中,有美食和餐馆这两个实体)。这会决定他们是如何显示的。

    <%@ Control Language="C#" CodeBehind="Restaurant.ascx.cs" Inherits="MyApp.Web.RestaurantEntityTemplate" %>  <asp:DynamicControl  ID="DynamicControl8" runat="server" DataField="ImagePath" /> <ul class="restaurant"> <li>   <ul class="restaurantDetails">       <li><h2><asp:DynamicControl ID="NameControl" runat="server" DataField="Name" /> </h2> </li>       <li><asp:DynamicControl ID="DynamicControl1" runat="server" DataField="ContactName" /> (<asp:DynamicControl ID="DynamicControl2" runat="server" DataField="ContactTitle" />)</li>       <li><asp:DynamicControl ID="DynamicControl3" runat="server" DataField="Address" />  </li>       <li><asp:DynamicControl ID="DynamicControl4" runat="server" DataField="City" />, <asp:DynamicControl ID="DynamicControl5" runat="server" DataField="Region" />  <asp:DynamicControl ID="DynamicControl6" runat="server" DataField="PostalCode" />  </li>       <li><asp:DynamicControl ID="DynamicControl7" runat="server" DataField="Phone" />  </li>       <li><asp:HyperLink runat="server" ID="link"  NavigateUrl="<%#GetDetailsUrl() %>" Text="details.."></asp:HyperLink></li>   </ul> </li> </ul>

    这里我们只是做了些简单的格式化操作,然后把我们需要在备选内容中显示的字段挑选出来。对美食实体也重复同样的操作…

    现在我们已经可以准备运行了。

    访问根目录,在没有添加任何Url参数的情况下,我们会看到一个餐馆列表,当然,全都是HTML代码。

    clip_image008[5]

    接着我们可以添加一个导航来定位某个特定餐馆的所有美食。

    clip_image009[5]

    但是,让我们在真正的浏览器中浏览此页面,确保我们看到的和搜索引擎看到的是一样的。

    Lynx还活着!Lynx是我92年在北卡罗来纳州州立大学Leazar实验室的DEC2100机器上用过的第一个浏览器...现在还可以正常工作!

    clip_image010

    还有细节信息:

    clip_image011

    这款经典的文本浏览器让我们看到了纯文本模式下页面的样子,这恰恰是搜索引擎蜘蛛所看到的。

    现在,来看真正的测试。

    我们使用Bing去搜索“我的美食浏览器——和Joe学烹饪”,显然,这个页面确实在那。

    clip_image012

    点击这个链接?

    浏览器导航到的页面正是我们期望的页面。

    clip_image013

    当然,这在另外一个搜索引擎来说也是一样的... 如果你刚好是另外这个搜索引擎的用户:-)

    总结

    在上面这个例子中,我们学习了如何创建一个SEO优化过的、以数据驱动的Silverlight应用程序的基本操作。总共分为三个步骤:

    • 步骤1:做好重要的页面的深层链接
    • 步骤2:使用网站地图(Sitemap)让搜索引擎知道你网站的所有深层链接
    • 步骤3:对于重要内容,提供一个备选版本

    希望你们喜欢~

    更多信息,请参考:  点亮Silverlight的SEO之路。

    posted @ 2011-11-01 14:08  ChaunceyHao  阅读(266)  评论(0编辑  收藏  举报
  • 汽车羊毛坐垫长毛
  • 车垫四季通用
  • 御车宝
  • 凯美瑞坐垫四季通用
  • 手编冰丝坐垫
  • 珍珠戒指新款
  • 汽车皮坐垫四季垫
  • 汽车四季坐垫新款
  • 汽车皮坐垫四季通用
  • 汽车羊毛坐垫短毛
  • 包女
  • 汽车亚麻坐垫包邮
  • 汽车布坐垫
  • 汽车布坐垫套
  • 紫风铃亚麻四季坐垫
  • 蒙奇奇汽车
  • 蒙奇奇汽车毛绒坐垫
  • 蒙奇奇坐垫三件套
  • 尼罗河车坐垫
  • 尼罗河手编坐垫
  • 尼罗河四季垫
  • 羊剪绒坐垫
  • 牧宝冬季坐垫
  • 牧宝四季垫正品
  • 牧宝羽绒坐垫
  • 牧宝汽车垫羊毛
  • 高压洗车机
  • 高压洗车器
  • 高压洗车水泵
  • 高压洗车泵
  • 熊猫洗车
  • 洗车器高压220v
  • 洗车器便携高压
  • 高压水枪洗车机
  • 220v高压水枪洗车机
  • 家用洗车水枪高压枪
  • 汽车洗车水枪
  • 虎贝尔洗车水枪
  • 水枪头洗车
  • 洗车水枪水管
  • 洗车水枪套装
  • 洗车水枪接头
  • 佳百丽洗车水枪
  • 洗车工具套装
  • 洗车用品工具
  • 家用洗车工具
  • 汽车洗车工具
  • 洗车设备工具
  • 洗车刷子
  • 现代途胜保险杠
  • 现代新胜达保险杠
  • 保险杠车贴纸
  • 后保险杠车贴纸
  • 前保险杠车贴
  • 雨燕保险杠
  • 后保险杠贴纸
  • 前保险杠贴纸
  • 汽车保险贴纸
  • rav4后保险杠
  • 专业运动文胸htc c715e evo design 4g
  • htc evo 4g a9292
  • htc x515m g17 evo 3d
  • htc one x s720e
  • htc x920e
  • 名牌手表男正品
  • povos 奔腾 pffn3003苏泊尔电热水壶正品
  • tcl tcl电热水壶ta-kb181a
  • 乔邦181j
  • 乔邦不锈钢电热水壶
  • supor 苏泊尔 swf15j3-150
  • 逸动空气滤芯
  • 空气压缩机喷漆
  • 德国车载空气净化器
  • sr927w手表电池
  • cartier手表蓝气球
  • 机械手表男士名表
  • anne klein手表
  • 手表柜台展示柜
  • 女士皮带 头层牛皮
  • 女士皮带 头层纯牛皮
  • jeep皮带 纯牛皮
  • 女皮带 真皮 牛皮
  • 女士皮带 真皮
  • 头层牛皮皮带
  • 女士皮带 时尚
  • 真皮皮带头层牛皮女
  • 女士皮带 包邮
  • 皮带条 头层牛皮
  • 女士皮带 时尚 宽
  • 头层牛皮纯铜扣皮带
  • 女士皮带 纯牛皮
  • 女士皮带头层纯牛皮
  • 女士皮带头层牛皮
  • jeep皮带纯牛皮
  • 女皮带真皮牛皮
  • 女士皮带真皮
  • 女士牛皮皮带包邮
  • 女士皮带时尚
  • 三星微单镜头
  • 三星单反镜头
  • 三星50-200镜头
  • 三星7100镜头保护膜
  • 三星i9210
  • 三星i9210手机套面包蛋糕酸奶机
  • 鸡蛋牛奶面包干饼干
  • 面包片饼干
  • 摩托车机油