ASP.NET MVC URL重写与优化(1)-使用Global路由表定制URL
引言---
在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量。
URL重写与优化就是搜索引擎优化的手段之一。
假如某手机网站(基于ASP.NET MVC)分类页面URL是这样的,
http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&page=1。
太多的QueryString对爬虫是不友好的,一般的做法是,去掉不必要的QueryString,让URL更简短 :http://www.xxx.com/category/1000。
但一个好的URL要语义化,更好的反应网站结构,所以使用类名来作为URL要比分类id更胜一筹 :http://www.xxx.com/categoryname。
这里列举了URL重写与优化的最为普遍的两个需求,
这里将分为两篇来解决这两个问题。
- 初级篇-使用Global路由表定制URL
- 进阶篇-继承RouteBase玩转URL
这里我假设各位看官已经对ASP.NET MVC 已经有所了解。文中有任何问题欢迎指正。
一,认识Global路由表
我们新建一个ASP.NET MVC Web程序的时候,会生成一个Global.asax文件。如下:

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匿名对象。
这条语句添加了一条路由规则,将URL表达式映射到一个路由值-指向某个Controller下的某个Action方法。
e.g.:我们在浏览器中输入相对地址/home/index HomeController.Index()方法就会被调用。
发布网站的时候Global.asax文件会被编译成DLL。程序启动的时候就会首先调用Application_Start()方法,
执行RegisterRoutes(RouteTable.Routes)语句后,路由表就完成注册了,默认路由规则开始生效。
有了这条默认规则,我们就可以使用/controllername/actionname?querystring=...这样的相对URL来调用程序中的每个action方法。
熟悉ASP.NET MVC的人可以想到,如果没有什么特殊要求的系统,比如网站后台,就不用再折腾了,一条默认路由规则足矣撑起整个Web程序了。
二,路由匹配规则
1.首先我们需要科普一下如何来定义一条URL表达式。
首先URL表达式都是相对的,不包括主机域名部份(比如http://www.xxx.com)。{}保存的是占位符,“/”,“.”则用来作为分隔符,什么都有没则是静态内容:
- URL /category/showcategory/1000 匹配 "{controller}/{action}/{id}"。
- URL /product/2012/4/28.html 匹配 “/product/{year}/{month}/{day}.html” ,诸如此类。
这里需要注意的是{controller}和{action}是保留的两个占位符,分别代表对应的控制器名称和操作名称。
{controller}对应控制器的名称,这里规定是控制器全名去掉Controller后缀的部份,CategoryController即Category
{action}对应控制器内的Action方法的名称。
2.路由有两种不同的操作。
获取路由值,当你在浏览器输入一个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 哪个方法会被调用呢?如果上下颠倒一下呢?
<调用HomeController.Index()/颠倒后调用HomeController.Others>
获取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>
如果把这条路由规则写在默认规则的上面呢?
<谁写在上面就显示其匹配的URL>
3.上面的问题大家可以自己尝试一下,很明显,路由的匹配是 自上而下 的,只要匹配到第一条记录,就会返回对应URL或者路由值。
这一点非常重要。很多人在定制路由规则的时候,总是发现自己的规则不生效。那么你就应该检查是不是被前面的路由覆盖掉了。
三,解决开始的问题
从这个站的URL可以看出,
http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&page=1,
用的应该只是默认路由规则,
可以推断出有一个名为Category的控制器,其中有个方法名为ShowCategory,必选参数为categoryid,其他为可选参数。
根据上面介绍的Global路由表来完成URL重写的知识,
按照站长的要求,我们只需要添加一条路由规则就完事了。是不是很简单?
routes.MapRoute("Category", "category/{categoryid}", new { controller = "Category", action = "ShowCategory" }
这时候一定要注意喔,不要写在默认路由的下面,你懂得。不然你就悲剧了。
一般情况下我们建议如果你需要使用Globel文件来定制路由,请删除最初的默认路由,并给每一个Action定制自己的路由。
routes.MapRoute("Home", "", new { controller = "Home", action = "Index" });
使用上述路由来取代默认路由。
浏览器输入相对URL “/”时就会调用HomeController.Index()方法了。
这样做的原因是,默认路由容易与定制路由起冲突。
强烈建议大家自己动手玩一玩Global文件,重写URL来亲身感受一下。其实有一个悬念我留给大家了,
为什么默认规则下获取首页的URL是“/”而不是“/home/index”呢。^_^
匹配规则还有贪婪匹配和缺省匹配一说,这个留大家去了解把。
使用Global还是有很多的局限性的,上例中因为方法ShowCategory有一个参数categoryid,它存在与路由信息的键值对中,
在配置时我们就可以使用占位符来{categoryid}来显示它。
换作http://www.xxx.com/categoryname 这样的URL,如果不修改程序,Global是无能为力的,因为categoryname并不存在与路由信息的键值对中。
应对这样的较为复杂多变的URL重写与优化的需求(需求总是复杂多变的=。=)。
ASP.NET MVC URL重写与优化(1)-使用Global路由表定制URL的更多相关文章
- ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL
ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流 ...
- ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC ...
- [转载]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由.也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值,我们无法将 ...
- ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase
原文地址:http://www.51csharp.com/MVC/882.html ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL 引言-- 在初级篇中,我们 ...
- [转]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
本文转自:http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NE ...
- ASP.NET MVC ETag & Cache等优化方法
背景 最近有一个项目是用SmartAdmin + Jquery + EasyUI 一个ASP.NET MVC5的项目,一直存在一个性能问题,加载速度比较慢,第一次加载需要(在没有cache的情况下)需 ...
- [转]Asp.net mvc 网站之速度优化 -- 页面缓存
网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...
- Asp.net mvc 网站之速度优化 -- 页面缓存
网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...
- MVC 路由URL重写
在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量. URL重写与优化就是搜索引擎优化的手段之一. 假如某手机网站(基于ASP.NET MVC)分 ...
随机推荐
- tomcat、腾讯云主机和微信
腾讯云主机和微信 申请一个腾讯云上的服务器(在这里我是申请的Linux系统,里面自己事先装好了tomcat.jdk等所需要用到的工具,注意做好必要的配置工作) 连接服务器和部署项目时必要的步骤:1.将 ...
- Js中的window.parent ,window.top,window.self 详解
在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法 ...
- Linux多线程实例练习 - pthread_create()
Linux多线程实例练习 pthread_create():创建一个线程 int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, ...
- struts2中用xml配置文件去验证填写信息
xml名字是这样的 actionName-validation.xml 每个action 对应一个xml文件 xml文件和action放在同一个包下 后台验证用户输入是否符合格式要求,不符合,提交后返 ...
- call与apply基础用法告诉你
Js用法中还有个极好的但是有些抽象的用法——call与apply,今天我要简单总结一下: var ob1={ //对象ob1 name:"ob1", func1:function( ...
- JAVA 往jar包添加class文件
(1) jar -uf jarfile.jar yourclasses (2) 右击要打包的文件夹,选择“添加到压缩文件”,弹出对话框: 把压缩文件格式改为zip,再把压缩文件名中的反缀改为.jar, ...
- 没有Iphone也能装逼:让Android版QQ显示成Iphone6
在智能手机市场上苹果的iPhone一直都有着很高的关注度,不过其高昂的价格却让人望而却步.有些年轻人为了拥有一部iPhone 不惜出租胸部来做广告位,更有甚者还卖身卖肾.其实这又何苦呢.其实只要小小地 ...
- ES6 有什么新东西
ES6 有什么新东西? 你可能已经听说过 ECMAScript 6 (简称 ES6)了.ES6 是 Javascript 的下一个版本,它有很多很棒的新特性.这些特性复杂程度各不相同,但对于简单的脚本 ...
- C++_static与非static成员(函数)
static与非static成员(函数) <C++ Primer>第4版399页: 对于特定类类型的全体对象而言,访问一个全局变量有时是必要的.然而,全局变量会破坏封装:对象需要支持特定 ...
- IOS第一天多线程-05GCD队列的使用
************** // // HMViewController.m // 08-GCD02-队列的使用(了解) // // Created by apple on 14-9-15. // ...