好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ASP.NET MVC URL重写与优化(初级篇)使用Global路由表定制URL

ASP.NET MVC URL重写与优化(初级篇)使用Global路由表定制URL

引言---

  在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量。

  URL优化就是搜索引擎优化的手段之一。

  如果某站长的手机网站(基于ASP.NET MVC)分类页面URL是这样的,http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&page=1。

  他看了一些SEO的资料后向手下的程序猿提出,URL要简短:http://www.xxx.com/category/1000。

  等他对SEO更了解之后又提出,URL要语义化,更好的反应网站结构:http://www.xxx.com/categoryname。

  这里将分为两篇来解决这两个问题。

初级篇-使用Global路由表定制URL 进阶篇-继承RouteBase玩转URL (传送门还在修,敬请期待)

  这里我假设各位看官已经对ASP.NET MVC Web程序的运行机制已经有所了解。文中有任何问题欢迎指正。

  ---------------------------------------------引言END-----------------------------------------  

一,认识Global路由表

  我们新建一个ASP.NET MVC Web程序的时候,会生成一个Global.asax文件。如下:

View Code

  1   using   System;
   2   using   System.Collections.Generic;
   3   using   System.Linq;
   4   using   System.Web;
   5   using   System.Web.Mvc;
   6   using   System.Web.Routing;
   7  
  8   namespace   JohnConnor.Web
   9   {
  10       //   注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
  11       //   请访问   http://go.microsoft.com/?LinkId=9394801 
 12  
 13       public   class   MvcApplication : System.Web.HttpApplication
  14       {
  15           public   static   void   RegisterGlobalFilters(GlobalFilterCollection filters)
  16           {
  17              filters.Add( new   HandleErrorAttribute());
  18           }
  19  
 20           public   static   void   RegisterRoutes(RouteCollection routes)
  21           {
  22              routes.IgnoreRoute( "  {resource}.axd/{*pathInfo}  "  );
  23  
 24               routes.MapRoute(
  25                   "  Default  " ,  //   路由名称 
 26                   "  {controller}/{action}/{id}  " ,  //   带有参数的 URL 
 27                   new  { controller =  "  Home  " , action =  "  Index  " , id = UrlParameter.Optional }  //   参数默认值 
 28               );
  29  
 30           }
  31  
 32           protected   void   Application_Start()
  33           {
  34               AreaRegistration.RegisterAllAreas();
  35  
 36               RegisterGlobalFilters(GlobalFilters.Filters);
  37               RegisterRoutes(RouteTable.Routes);
  38           }
  39       }
  40  }

   首先 Application_Start()是Web应用程序启动的时候的入口。

  RegisterGlobalFilters()方法是用来注册全局筛选器的。这个与此篇内容无关。

  而RegisterRoutes()方法是用来注册路由表的

  这里已经有了两条默认的路由规则:

routes.IgnoreRoute( "  {resource}.axd/{*pathInfo}  " );

    IgnoreRoute()是 RouteCollection 路由表类的扩展方法,用于忽略指定的路由请求。这句 意思是忽略对扩展名为. axd文件 的请求。 这个方法不在此详述了。

  routes.MapRoute(
                  "  Default  " ,  //   路由名称 
                 "  {controller}/{action}/{id}  " ,  //   带有参数的 URL 
                 new  { controller =  "  Home  " , action =  "  Index  " , id = UrlParameter.Optional }  //   参数默认值 
            );

   MapRoute() 方法也是 RouteCollection 类的一个扩展方法。这里是它最常用的一个重载,映射指定的 URL 路由并设置默认路由值:

" Default " 代表的是要映射的路由的名称, 这个名称在应用程序的路由的集合(routes对象)中是唯一的 ,如果重名生成时就会报错。 " {controller}/{action}/{id} " 代表的是路由的  URL 模式 。通过{}来定义的是占位符。   new  { controller =  "Home" , action =  "Index" , id = UrlParameter.Optional } 声明了一个 包含默认路由值的object匿名对象 。 controller ,action,id则对应上述的占位符。

  这条语句设置了一个最基本的默认路由规则,通过controller名,action名和可选参数来进行路由匹配。

  发布网站的时候Global.asax文件会被编译成DLL。程序启动的时候就会首先调用 Application_Start() 方法,我们的路由表注册后,默认路由规则就生效了。

  如果没有什么特殊要求的系统,比如网站后台,就不用再折腾了,一条默认路由规则足矣。

二,路由匹配规则

  1. 首先我们需要科普一下如何来定义一条URL模式。

  首先 URL模式都是相对的 ,不包括主机域名部份。 {} 保存的是占位符, “/”,“.” 则用来作为分隔符。什么都有没则是静态内容。比如:

URL /category/showcategory/1000  匹配  " {controller}/{action}/{id} " 。 URL /product/2012/4/28.html         匹配   “/product/{year}/{month}/{day}.html”  则对应的像 ,诸如此类。

  这里需要注意的是 {controller} 和 {action} 是保留的两个占位符,分别代表对应的控制器名称和操作名称。

   {controller} 对应控制器的名称,这里规定是CategoryController去掉Controller后缀的部份,即Category

   {action} 对应控制器内的Action方法的名称。

   2. 路由有两种不同的操作。

   URL定向 ,当你在浏览器输入一个URL时,程序会在我们添加的路由表中通过对比URL模式进行匹配,找到对应的包含路由值的对象,从而定位到具体的资源上。

    我们来看一个例子,我们来添加两条路由规则。

routes.MapRoute( "  Test  " ,  "  where-are-you-going  " ,  new  { controller =  "  Home  " , action =  "  Index  "   });
routes.MapRoute(  "  Test1  " ,  "  where-are-you-going  " ,  new  { controller =  "  Home  " , action =  "  Others  "  });

  假设HomeController里有两个Action 分别是 Index 和 Others 。

  各位看官觉得在浏览器输入 http://www.xxx.com/where-are-you-going 会进入哪个方法体中呢?如果上下颠倒一下呢?

 

   获取URL ,下面这段代码就使用Url.Action方法通过Controller和Action名完全限定了一个URL,

  即我们有了一个路由值,通过在路由表中匹配,可以找到对应的URL模式,进而生成一个URL

< a href =" @  Url.Action (" Index ", " Home ")">主页</ a >

  现在我们在默认的路由规则下再添加一条如下的路由规则

routes.MapRoute( "  MyHome  " ,  "  myhome/{id}  " ,  new  { controller =  "  Home  " , action =  "  Index  " , id = UrlParameter.Optional });

  你觉得页面会显示什么呢?

 <  a   href  ="http://www.xxx.com/"  > 主页 </  a  >  
or
  <  a   href  ="http://www.xxx.com/myhome"  > 主页 </  a  > 

  如果把这条路由规则写在默认规则的上面呢?

   3. 上面的问题大家可以自己尝试一下,很明显,路由的匹配是  自上而下  的,只要匹配到第一条记录,就会返回对应URL或者路由值。

  这一点非常重要。很多人在定制路由规则的时候,总是发现自己的规则不生效。那么你就应该检查是不是被前面的路由覆盖掉了。

三,解决开始的问题

  从这个站的URL可以看出,http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&page=1,

  用的应该只是默认路由规则,可以推断出有一个名为Category的控制器,其中有个方法名为ShowCategory,必选参数为categoryid,其他为可选参数。

  按照站长的要求,我们只需要添加一条路由规则就完事了。是不是很简单?

routes.MapRoute( "  Category  " ,  "  category/{categoryID}  " ,  new  { controller =  "  Category  " , action =  "  ShowCategory  "  }

  这时候一定要注意喔,不要写在默认路由的下面,你懂得。不然你就悲剧了。

---------------------------------------------END-----------------------------------------  

  强烈建议大家自己动手玩一玩Global文件,写一些路由规则来亲身感受一下。其实有一个悬念我留给大家了,

  为什么默认规则下获取首页的URL路由是 “/” 而不是 “/home/index” 呢。^_^

  其实我自己也没有玩的很精,只是比较熟悉,有任何错误之处请指正。

  使用Global还是有很多的局限性的,http://www.xxx.com/categoryname 像这样,每个分类都有自己的名字,不可能写在路由表中。

  进阶篇中会教大家如何通过继承 RouteBase 类来完全Hold住场面。祝大家五一快乐。回来再写。。。

  

 

  

分类:  ASP.NET MVC

标签:  ASP.NET MVC

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于ASP.NET MVC URL重写与优化(初级篇)使用Global路由表定制URL的详细内容...

  阅读:32次