第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。

image

注:第三种URL不合法

 

- routes.MapRoute("simple","{controller}/{action}/{id}");

 

URL的匹配规则

- site/{controller}/{action}/{id}(静态字符串)

image

匹配的时候一定要给一个明确的划分符号。

 

默认路由

-添加默认匹配路由参数

image

 

 

 

路由参数默认值需从最后一个参数开始往前写,顺序可以交换,但中间参数不能有遗漏,不然系统不知道该如何匹配路由,下面就是错误的路由

image

 

关于URL的约束

- http://example.com/2010/08/23/

- http://example.com/products/list/food

 

正则表达式约束

image

 

路由匹配的顺序是按照添加顺序来匹配的,当遇到路由格式一样时,先注册的路由先匹配。

 

命名一个Routes

当我们希望调用某个指定的路由解析时,就需要用到路由的命名。

image

 

Area

-指定作用域

 

ASP.Net网站大了以后它的分层架构和分文件夹管理是个大问题。我们允许把Models、Controllers、Views都是用区域来划分,所以一个大的工程网站可以划分成许多不同功能的小区域网站,每一个网站都有自己的一套路由、Models、Controllers和Views。

 

注册Area Route

image

 

AreaRoute冲突

-如何处理冲突

如果在不同Area中定义了同名的Routes,就会发生冲突。解决方法有二,第一:可以把它们取不同的名字;第二:使用一个namespace。

image

最后一个参数是路由的命名空间。

 

捕获所有参数

-让route匹配任意多参数

image

 

 

停止匹配和忽略匹配

image

停止匹配的路由都不转发。这条路由就直接扔给.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运行时开始之前截获所有的路由信息并把有关的诊断信息输出。

image

然后放在工程的bin文件夹下,但是要记得在发布之前将其删除。

运行效果

image

 

总结

-Url和Routes介绍

-Routes匹配URL的工作方式

-使用Routes

2010.9.25

posted @ 2010-09-25 23:32  山天大畜  阅读(1438)  评论(1编辑  收藏  举报