第5讲:MVCRoute和urls
2010.9.5 苏鹏
内容介绍
-Url和Routes介绍
-Routes匹配URL的工作方式
-使用Routes
预备知识
-安装Visual Studio 2010 Express
-了解ASP.Net
-了解设计模式基本概念
关于Urls
-http://example.com.products.list.aspx?id=123&catid=33723&page=3(糟糕的Url)
URL的六个要求:
1.域名好记好拼写
2.URL尽量短(使用位置代替参数的变量名)
3.URL好输入(最好不要输入特殊字符,如&)
4.URL可以体现网站的结构(逻辑结构)
5.URL规律性强,用户可以自行猜测构造(尽量让机器爬虫能猜到,这样网站访问量才大)
6.URL固定,并持久不变
URL,U代表Uniform统一的,R代表Resource资源,L代表定位Locator,总体来说就是表示统一资源定位。在ASP.Net MVC中,URL绝不只是意味着映射到一个文件,通常意味着映射到一个类或一个方法。
ASP.Net MVC Routing介绍
-接受用户输入并指向Controller的Action
-把Controller的Action输出成URLs
Routing与URLRewriting技术的比较
这两种技术都用来实现把路径与物理文件分离,并且都用于形成逻辑清晰,便于SEO理解的优美的URL。
这两种技术最主要的区别是,Rewriting技术最终还是要把页面转发。URL虽然是重写了,但是它最终还是要写回当年的样子。也就是:
一开始可能看见的是
- /product/bolts.aspx
但最后实际上请求的路径还是
- /product/display.aspx?productid=123
但Routing不会,Routing从根本上解决了这个问题。它不会重写URL。
另外一点是Rewriting是单向的。给一个bolts.aspx,它能够拆开分析,但如果要它从后台代码生成一个新的URL,是没有这个能力的。因为Rewriting只管响应Request,匹配URL,把它转义。它没有从后台机制上,把一个Controller和Action拼凑成URL放到前台表示层的能力。而Routing技术还能生成URL,通过Controller和Action的名字生成URL,这是Rewriting做不到的。所以Routing有点像Rewriting的双向2.0版本。
定义Routes
-Route URLs
每个ASP.Net MVC都至少有一个默认的Routes来实现应用程序。当它们遇到请求的时候,它就知道去找哪个Controller和Action,如果应用程序结构比较复杂, 我们需要在Routes里实现多条路由信息。Routes存放在RoutesCollection对象的RoutesTable.Routes的集合中,所以Routes是一开始写好的一种解析的方式,这种解析方式被注册到全局变量里。
Route URLs
- routes.MapRoute("simple","{first}/{second}/{third}");
当用户请求发过来的时候,Routing对象就把请求放到一个RouteValueDictionary的字典类里,URL中的参数都在字典中保存起来。在上面的URL中,会在字典里创建三个键值对,键分别是first、second、third,值会等到具体接收的时候传入储存。这里值value并不是简单的string字符串,而是object。
注:第三种URL不合法
- routes.MapRoute("simple","{controller}/{action}/{id}");
URL的匹配规则
- site/{controller}/{action}/{id}(静态字符串)
匹配的时候一定要给一个明确的划分符号。
默认路由
-添加默认匹配路由参数
路由参数默认值需从最后一个参数开始往前写,顺序可以交换,但中间参数不能有遗漏,不然系统不知道该如何匹配路由,下面就是错误的路由
关于URL的约束
- http://example.com/2010/08/23/
- http://example.com/products/list/food
正则表达式约束
路由匹配的顺序是按照添加顺序来匹配的,当遇到路由格式一样时,先注册的路由先匹配。
命名一个Routes
当我们希望调用某个指定的路由解析时,就需要用到路由的命名。
Area
-指定作用域
ASP.Net网站大了以后它的分层架构和分文件夹管理是个大问题。我们允许把Models、Controllers、Views都是用区域来划分,所以一个大的工程网站可以划分成许多不同功能的小区域网站,每一个网站都有自己的一套路由、Models、Controllers和Views。
注册Area Route
AreaRoute冲突
-如何处理冲突
如果在不同Area中定义了同名的Routes,就会发生冲突。解决方法有二,第一:可以把它们取不同的名字;第二:使用一个namespace。
最后一个参数是路由的命名空间。
捕获所有参数
-让route匹配任意多参数
停止匹配和忽略匹配
停止匹配的路由都不转发。这条路由就直接扔给.NET Framework运行时来解决。axd文件本身是IIS的一个帮助文件,一般都是WebResource.axd,它应该是IIS的API的一个映射,所以它本身也不应该路由。
推荐写下面一种忽略路由的方式,因为上面那种一样会生成RoutingHandler,它有一定的查询开销。相比而言,第二种直接在匹配的时候把这种模式略过了,这样性能会比第一种模式略好。所以忽略匹配是比较推荐的。
调试路由信息
-使用Routing Debugger
ASP.Net MVC运行时会在Visual Studio之前捕获Routes并进行处理。所以一旦添加了Routes信息是不能在VS里添加断点进行调试的。Routes错误也非常严重,可能会导致整个应用程序彻底崩溃。
解决方法是使用第三方的Routing Debugger工具。它能够在ASP.Net MVC运行时开始之前截获所有的路由信息并把有关的诊断信息输出。
然后放在工程的bin文件夹下,但是要记得在发布之前将其删除。
运行效果
总结
-Url和Routes介绍
-Routes匹配URL的工作方式
-使用Routes
2010.9.25