本系列文章基于Microsoft ASP.NET MVC Beta.
在一个route中,通过在大括号中放一个占位符来定义( { and } )。当解析URL的时候,符号"/"和"."被作为一个定义符来解析,而定义符之间的值则匹配到占位符中。route定义中不在大括号中的信息则作为常量值。
下面是一些示例URL:
Valid route definitions | Examples of matching URL | |
{controller}/{action}/{id} | /Products/show/beverages | |
{table}/Details.aspx | /Products/Details.aspx | |
blog/{action}/{entry} | /blog/show/123 | |
{reporttype}/{year}/{month}/{day} | /sales/2008/1/5 |
通常,我们在Global.asax文件中的Application_Start事件中添加routes,这确保routes在程序启动的时候就可用,而且也允许在你进行单元测试的时候直接调用该方法。如果你想在单元测试的时候直接调用它,注册该routes的方法必需是静态的同时有一个RouteCollection参数。
下面的示例是Global.asax中的代码,演示了添加一个包含两个URL参数action 和 categoryName的Route对象:
{
// 忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute( " {resource}.axd/{*pathInfo} " );
routes.MapRoute(
" Category " , // Route 的名称
" Category/{action}/{categoryName} " , // 带有参数的URL
new { controller = " Category " , action = " Index " , categoryName = " 4mvc " } // 设置默认的参数
);
}
protected void Application_Start()
{
// 在程序启动的时候注册我们前面定义的Route规则
RegisterRoutes(RouteTable.Routes);
}
更多文章请参考:
System.Web.Routing入门及进阶 下篇 By 重典 System.Web.Routing入门及进阶 上篇 By 重典 ASP.NET MVC URL Routing 学习 By Q.Lee.lulu ASP.NET Routing (官方文档)在这里我不打算再详细去讲解。以下只是简单的说明一下。
忽略对某类URL的Routing:
routes.IgnoreRoute( " {resource}.axd/{*pathInfo} " );
添加约束条件,支持正则表达式。例如我们需要对id参数添加一个必须为数字的条件:
" Default " ,
" {controller}/{action}/{id} " ,
new { controller = " Home " , action = " Index " , id = "" },
new { id = @" [\d]* " } // id必须为数字
);
使用星号(*)匹配不确定个数的参数,这会匹配URL后面所有的剩余的参数。例如:
query/{queryname}/{*queryvalues}
对于url:query/aspnetmvc/preview5/routing ,则queryvalues参数匹配的参数为 preview5/routing。
url匹配Route是根据Route的定义顺序来自上而下匹配的。例如我们定义两个Route:
{
routes.MapRoute(
" Default " , // Route 的名称
" {controller}/{action}/{id} " , // 带有参数的URL
new { controller = " Home " , action = " Index " , id = "" } // 设置默认的参数
);
routes.MapRoute(
" Post " ,
" Post/{id} " ,
new { controller = " Post " , action = " Index " , id = "" }
);
}
不知你看出上面定义的两个Route有什么问题没有?我想你看出来了,URL永远都匹配不了第二个Route,也就是名为Post的Route,因为能匹配第二个Route的url一样也能匹配第一个Route,而url匹配Route是根据Route的定义顺序来自上而下匹配的,所以URL永远都匹配不了第二个Route。所以,在定义Route的时候,要将一些特别的Route放到前面。
如果你要将ASP.NET MVC部署到IIS6下面,由于IIS6对于http://blog.51mvc.com/index这类没有扩展名的URL是不会交由ASP.NET的aspnet_isapi.dll处理的,所以你的ASP.NET MVC程序部署到IIS6的时候可能会出现404错误。你可以为你的ASP.NET MVC站点添加一个通配符:
然后点击"通配符应用程序映射"下的"插入"按钮,在弹出的对话框中如下设置:
你如果担心添加通配符会给出现性能上的问题,那么你可以修改Route为带扩展名的,这个扩展名是完全由你自己定义的,例如我们使用4mvc来做url的扩展名:
" Default " , // Route 的名称
" {controller}.4mvc/{action}/{id} " , // 带有参数的URL
new { controller = " Home " , action = " Index " , id = "" } // 设置默认的参数
);
然后再在IIS6中添加这个扩展名的映射:
然后我们访问的URL类似于:http://blog.51mvc.com/Home.4mvc/index
群上有些朋友说希望教程能根据一个示例程序来写,那样更容易他们的学习。所以这里就写一个Blog的示例程序,为了方便,Model就直接使用Blogengine的业务实体部分。在这里我们先定义这个blog的Route:
![9310e85a14af99de4811ff4c77f1f911.jpe](https://i-blog.csdnimg.cn/blog_migrate/a9af314cccc3b1c20a00c16e7c3fb329.png)
![24a924a57ba6b3f2b51fc9edb7ea4186.jpe](https://i-blog.csdnimg.cn/blog_migrate/156b3a452247379d066a7687077a8e2f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
![24a924a57ba6b3f2b51fc9edb7ea4186.jpe](https://i-blog.csdnimg.cn/blog_migrate/156b3a452247379d066a7687077a8e2f.png)
![9310e85a14af99de4811ff4c77f1f911.jpe](https://i-blog.csdnimg.cn/blog_migrate/a9af314cccc3b1c20a00c16e7c3fb329.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![715f2d05503b99d41f3b6ba2cdccc84d.jpe](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![e083dfde5a91f50979fe8979b4012b9d.jpe](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![715f2d05503b99d41f3b6ba2cdccc84d.jpe](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![e083dfde5a91f50979fe8979b4012b9d.jpe](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
![715f2d05503b99d41f3b6ba2cdccc84d.jpe](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![e083dfde5a91f50979fe8979b4012b9d.jpe](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![715f2d05503b99d41f3b6ba2cdccc84d.jpe](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![e083dfde5a91f50979fe8979b4012b9d.jpe](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![715f2d05503b99d41f3b6ba2cdccc84d.jpe](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![e083dfde5a91f50979fe8979b4012b9d.jpe](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a64ee9dafc08211855da6602b1505772.png)
暂时就学到这里吧。后面我会给出本示例Blog程序的代码。Enjoy!Post by Q.Lee.lulu。
---------------------------------------------------------------------
更多内容,请关注http://blog.51mvc.com/ 和 http://bbs.51mvc.com/
转载请注明本文地址: ASP.NET MVC 入门3、Routing