I:URL友好化的优势

在过去,我们开发ASP.NET应用程序的时候常常会使用URL的QueryString去传递参数给ASP.NET处理.
如:http://localhost:1029/Default.aspx?key_1=value_1&key_2=value_2&key_3=value_3

在使用此类URL格式去做门户网站时,非常不利于让搜索引擎收录页面.另外还包含.aspx结尾还会令搜索引擎爬虫烛觉得这个页面是动态页从而放弃收录或降低页面在搜索结果中的排名.

面对这个问题,我们为了讨好搜索引擎爬虫首先必须要做的是:

A:使QueryString彻底消失,让爬虫认为这是一个独立页面

B:将.aspx更改为可自定义的后缀名格式(伪静态)

C:正确设置robots.txt

实验例子:

注意:/Default/Value_1/Value_2/Value_3.html这个文件根本不存在于硬盘上~

我们做下对比
旧URL:
http://localhost:1029/Default.aspx?key_1=value_1&key_2=value_2&key_3=value_3
新URL:
http://localhost:2636/Default/Value_1/Value_2/Value_3.jsp
http://localhost:2636/Default/Value_1/Value_2/Value_3.html

与之前的URL作对比,新的URL更短并实现了自定义文件后缀格式!更利于爬虫进行检索收录工作

另外
以下的路径均属于1个页面:
  /Default.aspx?key_1=something
  /Default.aspx?key_1=anything

以下的路径将会分为多个页面(从访问者角度来看):

/Default/something.html

/Default/anything.html

像这类短URL还有助于用户记忆及反映站点结构,下面举个例子
比如在博客园里我的博客URL为http://www.cnblogs.com/highend/
而其他用户的URL则为http://www.cnblogs.com/UserName/

因为有了这个友好化URL,从而避免了出现尴尬的URL http://www.cnblogs.com/blog.aspx?userName=highend

接下来介绍在ASP.NET MVC当中友好化URL的实现!

II:在ASP.NET MVC3当中URL友好化的实现

在了解了URL友好化的优势以后,接下来将会为你介绍在ASP.NET MVC3中实现URL友好化的重型武器 - 路由.

小提示:路由并不是ASP.NET MVC独有!而是ASP.NET中的一个重要功能!MVC里的路由只不过是扩展了ASP.NET的路边由功能罢了!

1.ASP.NET MVC3路由注册的位置

当新建好一个MVC3项目后,可以在根目录下的Global.asax.cs文件内看到定义了一个继承System.Web.HttpApplication类的MvcApplication类,这个类里面就包含了MVC3的路由设置.具体请看下面贴出的MvcApplication部分代码

public static void RegisterRoutes(RouteCollection routes)
{routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );}protected void Application_Start()
{AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);
}

摘段MSDN的关于Application_Start的介绍

Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个 HttpApplication 实例都调用一次。

在此MVC3应用程序是通过在Application_Start()方法里调用静态方法RegisterRoutes(RouteCollection routes)使ASP.NET有实例化MvcHandler的能力,而RegisterRoutes方法内的routes.MapRoute( … )是MVC3里对RouteCollection添加的扩展方法,位于System.Web.Mvc.RouteCollectionExtensions!

提示:ASP.NET路由是一个Module位于

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\web.config

<httpModules>
    ...
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
    ...
</httpModules>

2.ASP.NET MCV3路由的使用介绍

前面第1小节里,我们已经知道了ASP.NET MVC3对System.Web.Routing.RouteCollection类进行了扩展,下面我将列出扩展方法的重载列表.然后对其找出一个参数最多的进行详细介绍!

System.Web.Mvc.RouteCollectionExtensions类 - 扩展方法列表的详细地址:

第一个我要介绍的是IgnoreRoute(string url)方法~

他的功能是用于将参数内设置的url排除在路由处理程序之外,也就是:忽略给定可用路由列表和约束列表的指定 URL 路由。

我们引用上一节里面的一行代码

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

作用:使路由系统忽略处理ASP.NET的Web资源文件(WebResource.axd或ScriptResource.axd).

另外这里的{resource}与{*pathInfo}我还未能在官网上找到详细的介绍资料.~所以在这我也只好忽略不谈~接着关注MapRoute的功能.

MapRoute方法在RouteCollectionExtensions里有6个重载版本!在这里我挑了一个参数最多的重载版本来进行介绍

public static Route MapRoute(
    this RouteCollection routes,
    string name,
    string url,
    Object defaults,
    Object constraints,
    string[] namespaces
)

name:路由在路由列表里的唯一名字(两次MapRoute时name不能重复)

url:路由匹配的url格式

defaults:路由url {占位符} 的默认值

constraints:url的 {占位符} 的约束

namespaces:这个是用于设置路由搜索的控制器命名空间!

在此详细分别介绍一下url, defaults, constraints这三个重要参数

在上章节的代码里MapRoute里面使用到了MVC里提供的两个特殊占位符{controller}及{action}它们分别描述的内容具体如下:


对此当MapRoute设置为

routes.MapRoute("Default", //name"{controller}/{action}", //urlnew { controller = "Home", action = "Index" }, //defaultsnull, //constraintsnull //namespaces
);

时,访问
http://localhost:2317/home/index
    {controller} = home, {action} = index [注意,提交的url是不区分大小写的]
http://localhost:2317/Home/About
    {controller} = home, {action} = about
http://localhost:2317/blog/home
    {controller} = blog, {action} = home
http://localhost:2317/account/logon
    {controller} = account, {action} = logon

在这里为你讲述一下defaults的作用.~
当你请求的Url属于
http://localhost:2317/
    {controller} = null, {action} = null
http://localhost:2317/Home/
    {controller} = home, {action} = null
http://localhost:2317/blog/
    {controller} = blog, {action} = null

在此~defaults会自动利用你设置好的默认值去设置{controller}及{action}

new { controller = "Home", action = "Index" }, //defaults

所以~如果你请求的url属于这种错误格式http://localhost:2317//index时~defaults并不会帮你自动完成设置

因为设置要有一个先后次序!

OK.url参数就先介绍到这里,更多的用途我会放在下一篇(控制器 & 视图)文章当中进行讲解!

MapRoute目前剩下的1个参数constraints的功能是对先前定义的{占位符}进行添加一个正则约束比如:

routes.MapRoute("constraints", //name"{controller}/{action}", //urlnull, //defaultsnew {controller = @"[a-z]{4,}", //controller必须为英文字符,最少长度为4action = @"[a-z]{4,}" //action必须为英文字符,最少长度为4}, //constraintsnull //namespaces
);

对于上面的MapRoute我们测试以下请求的URL的结果为:
/Home/index 通过
/Home/Seo 失败
/abc/Defgs 失败

如果你觉得正则匹配不符合你的要求那么你可以去实现System.Web.Routing.IRouteConstraint接口以满足你的要求!
在这里提及一下string[] namespaces参数.~
当在你的MVC3应用程序里建立了不是以Controllers结尾的控制器类命名空间时,就可以通过设置这个属性来让路由系统在url匹配时应该去找那些命名空间
routes.MapRoute("namespaces",
    "{controller}/{action}",
    null, null,
    new string[] { "MvcApplication1.Custom" }
);

设置后此参数后路由系统就会去找
MvcApplication1.Controllers, MvcApplication1.Custom下带Controller结尾的继承于Controller的类了!

介绍一下建立有Area时路由的注册情况:

III:自定义文件后缀名的实例下载


下载源代码
示例内用到的是IIS Express如果你没有安装IIS Express的话需要更改.csproj文件内的
<UseIISExpress>true</UseIISExpress> 设置为相应的值
参考资料:MSDN, ASP.NET MVC 1.0高级编程
本文到此结束!

转载于:https://www.cnblogs.com/highend/archive/2011/07/27/aspnet_mvc3_route.html

ASP.NET MVC3 系列教程 - URL友好化的重型武器[路由]相关推荐

  1. ASP.NET MVC3 系列教程 - 目录

    I:ASP.NET MVC3 新增的功能 ASP.NET MVC3 系列教程 - Razor视图引擎基础语法 ASP.NET MVC3 系列教程 - View的变化 ASP.NET MVC3 系列教程 ...

  2. ASP.NET MVC3 系列教程 - 部署你的WEB应用到IIS 6.0

    I:ASP.NET MVC3 部署的前期工作 1.确认部署的服务器操作系统环境 首先我们确认服务器的操作系统版本 可以从系统命令行工具里输入: systeminfo 获取相关操作系统信息例如 然后再确 ...

  3. ASP.NET MVC3 系列教程 - 如何使项目Debug进MVC3源代码

    I:关于如何Debug进MVC3源代码. 1.关于ASP.NET MVC3的源代码获取方法 ASP.NET MVC从1.0到3.0版本以来它的源代码是完全对外开放的,也正因为这个原因吸引了不少以前习惯 ...

  4. ASP.NET MVC3 系列教程 – Web Pages 1.0

    I:Web Pages 1.0中以"_"开头的特别文件(文件命名时不区分大小写) "_appstart.cshtml" & "_pagesta ...

  5. 【ASP.NET Identity系列教程(三)】Identity高级技术

    注:本文是[ASP.NET Identity系列教程]的第三篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...

  6. ASP.NET 5系列教程(七)完结篇-解读代码

     在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]&quo ...

  7. ASP.NET 5系列教程 (四):向视图中添加服务和发布应用到公有云

    向视图中添加服务 现在,ASP.NET MVC 6 支持注入类到视图中,和VC类不同的是,对类是公开的.非嵌套或非抽象并没有限制.在这个例子中,我们创建了一个简单的类,用于统计代办事件.已完成事件和平 ...

  8. [转]ASP.NET MVC3 新手教程:Hellow简单示例

    本文转自:http://www.cyqdata.com/cnblogs/article-detail-52905 今天给大伙介绍一下:ASP.NET MVC3 新手教程:Hellow简单示例,帮助新手 ...

  9. PVE系列教程(九)、openWRT设置主路由与旁路由模式

    PVE系列教程(九).openWRT设置主路由与旁路由模式 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://nas.hepcloud.top:7000 Hello,小伙伴们,这是凯尔 ...

  10. PVE系列教程(八)、安装OpenWRT软路由

    PVE系列教程(八).安装OpenWRT软路由 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000/ 本教程固件下载地址:http://nas.he ...

最新文章

  1. 了解因果论:从珀尔的《为什么》开始
  2. [转]html5: postMessage解决跨域和跨页面通信的问题
  3. oracle主键自动增长
  4. android 粘性service,Android服务1 Service
  5. 连接相机无法识别_车牌识别一体机在汽修门店安装中要注意的事项
  6. 闲来无事,拆个示波器玩玩。
  7. 线程控制原语之pthread_self和pthread_create函数
  8. php狼和兔子算法,PHP基于递归算法解决兔子生兔子问题php技巧
  9. 2013汇总计算 广联达gcl_Revit软件与广联达软件两者的区别?哪个好?
  10. Java分层架构的使用规则
  11. python os.access_Python用access判断文件是否被占用的实例方法
  12. vue插入富文本编辑器(支持视频和图片的上传)
  13. 〖3D激光点云〗深度学习点云知识!
  14. 宝峰对讲机16频率表_宝峰888S对讲机的16个信道频率是多少?
  15. abbyyfinereader文字识别软件编辑Pdf教程序列号教程
  16. 拉昆塔温德姆酒店中国首店即将亮相山东潍坊;复星旅文旗下Club Med落子北美市场 | 全球旅报...
  17. 考计算机网络证书转深户,惊?这个证书能帮你直接入深户,还没有学历要求? 你还在等什么...
  18. vuex中subscribe的使用
  19. Java基础知识(一) 基本概念
  20. sys.stdout.flush()

热门文章

  1. JQuery-Ztree 树插件下载 与 快速入门
  2. python中文列名报错__mssql.MSSQLDatabaseException:(207,b“无效列名'Hello'。DBLib错误消息20018...
  3. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_10-修改页面-前端-修改页面...
  4. 如何用纯 CSS 创作一个 3D 文字跑马灯特效
  5. Codeforces1037G A Game on Strings 【SG函数】【区间DP】
  6. 多进程——守护进程例子
  7. href 和 src 区别
  8. 【转载】在使用上perror和strerror应注意的地方
  9. 转的一个itoa实现(效率很高,并且能够正确处理INT_MIN)
  10. 如何使用Tomcat