• 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 分别是IndexOthers

      各位看官觉得在浏览器输入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
  • 相关阅读:
    让pv3d(papervision3D)支持单帧前进、后退(nextFrame)。
    4399 威武三国 网页游戏破解。
    策划进化史一 (2013-12-21)
    Java的一个高性能快速深拷贝方法。Cloneable?
    as3commons-bytecode 获取所有类的一个BUG
    MYSQL 大文件无法导入的问题。
    诡异的 未处理的IOErrorEvent 2035
    一个用微软官方的OpenXml读写Excel 目前网上不太普及的方法。
    如何在高并发环境下设计出无锁的数据库操作(Java版本)
    达洛克战记3 即将开服! What's New!
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2475818.html
Copyright © 2020-2023  润新知