本篇文章从基础到深入的介绍ASP.NET MVC中的Routing组件. Routing翻译过来是"路由选择", 负责ASP.NET MVC的第一个工作:识别URL, 将一个Url请求"路由"给Controller.
第一篇文章中我们已经学会了如何使用ASP.NET MVC, 虽然其中还有很多的细节没有深入了解, 但是对基本的处理流程已经有了认识:来了一个Url请求, 从中找到Controller和Action的值, 将请求传递给Controller处理. Controller获取Model数据对象, 并且将Model传递给View, 最后View负责呈现页面.
而Routing的作用就是负责分析Url, 从Url中识别参数, 如图:
这一讲就让我们细致的了解System.Web.Routing及其相关的扩展知识.
第一讲中实例的首页地址是: localhost/home/index
我们发现访问上面的地址, 最后会传递给HomeController中名为index的action(即HomeController类中的index方法).
当然服务器端不会自己去实现这个功能, 关键点就是在Global.asax.cs文件中的下列代码:
- 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 = "" } // Parameter defaults
- );
- }
- protected void Application_Start()
- {
- RegisterRoutes(RouteTable.Routes);
- }
回来看我们的Url: localhost/home/index
localhost是域名, 所以首先要去掉域名部分: home/index
对应了上面代码中的这种URL结构: {controller}/{action}/{id}
因为我们建立了这种Url结构的识别规则, 所以能够识别出Controller是home, action是index, id没有则为默认值"".
这就是Routing的第一个作用:
1.从Url中识别出数据.比如controller,action和各种参数.
如果跟踪程序, 接下来我们会跳转到HomeController中的Index()方法. 这是Routing内部为实现的第二个作用.
2.根据识别出来的数据, 将请求传递给Controller和Action.
但从实例中我们并不知道Routing如何做的这部份工作.第五部分我做了深入讲解.
在分析Routing的实现原理前, 先学习如何使用Routing为ASP.NET MVC程序添加路由规则.
这是最简单的为ASP.NET MVC添加识别规则的方法.此方法有如下重载:
- MapRoute( string name, string url);
- MapRoute( string name, string url, object defaults);
- MapRoute( string name, string url, string[] namespaces);
- MapRoute( string name, string url, object defaults, object constraints);
- MapRoute( string name, string url, object defaults, string[] namespaces);
- MapRoute( string name, string url, object defaults, object constraints, string[] namespaces);