引言
听到路由两字,想必首先想到的会是计算机网络中的路由,通过分组转发来将不同的数据包发送到对应的目的地址。其核心是路由表,表中记录了如何到达各目的地。
ASP.NET MVC(下文都用MVC来特指ASP.NET MVC)中的Routing同样的也是完成这件事。用户提交请求后,系统根据路由表将请求送至相应的Controller中,然后为用户请求做出响应。
概念
在Web应用中,我们都会通过URL(俗称网址)来发送我们对页面的请求,打开浏览器,输入我们将要访问网站的网址,然后等待浏览器加载我们期待的页面。
传统的Web Form开发,URL映射到的是一个具体的处理程序,磁盘上的物理文件,如一个aspx文件。
MVC中多数情况下是将URL映射到Controller和Controller下的Action。
一个仓库,传统的方式是用户直接拥有货物的地址,知道货物的具体位置,哪一个货架,哪一行,哪一列。而MVC则是用户需要告诉前台的仓库保管员,由仓库保管员找到用户需要的货物并交给用户。
过程
在学习路由时,我觉得我们应该清楚MVC是如何处理请求并响应的。控制器中类的每个公共方法被称为Action方法。ASP.NET路由系统内部根据请求的URL和路由配置调用对应的Action方法,完成处理操作后,再选择一个视图呈现给客户端。
路由表
Default
当新建一个新的MVC应用程序(以MVC3为例),会默认配置ASP.NET路由。在Global.asax文件中创建了一个Default路由表。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
}
一个MVC应用程序首次运行时,会调用Application_Start()方法。这个方法随后调用了RegisterRoutes()方法。RegisterRoutes()方法创建了路由表。
默认路由映射:
第一部分——Controller
第二部分——Controller下的Action
第三部分——名为id的参数
所谓默认路由,表明如果不填写Controller,会默认定位HomeController,如果不填写Action,会默认调用Index方法,如果不填写id,那么默认为空字符串。
即以下这些URL都会定位到HomeController.Index()方法,返回Index View视图。
Custom
对于多数简单的MVC应用程序来讲,默认的路由表已经足够用了,不过如果有特殊的路由需求,还可以建立自定义的路由表。
需要注意的是,我们应当把自定义的路由添加到默认路由前面,注意路由顺序。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Blog", // 路由名称,自定义的路由
"Archive/{entryDate}", // 带有参数的 URL
new { controller = "Archive", action = "Entry" } // 参数默认值
);
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = "" } // 参数默认值
);
}
小结
Routing不是只有MVC应用程序才会有,ASP.NET 4.0后,ASP.NET MVC的路由规则全部可以用于WebForms。