先来看下面两个个url,对比一下:
- http://xxx.yyy.com/Admin/UserManager.aspx
- http://xxx.yyy.com/Admin/DeleteUser/1001
对于第1个Url,假设它与服务器上的文件有直接的关系,那么服务器在接受客户端请求并将对应的文件传送给客户端。我们大概可以猜到它是对用户管理的一个页面,它的物理文件UserManager.aspx在网站根目录下面的Admin文件夹中。而第2个url,在不知道Mvc路由以及Url重写时,很难猜到这个Url背后具体有些什么,前提条件是基于.Net框架开发的Web项目。 那么在这里,我们引入Asp.Net Mvc Url路由这个概念,也正是本文所要阐述的主题,Url路由模块是负责映射从浏览器请求到特定的控制器动作。
基于上面提到的Url路由以及其作用,我们就大概能猜到第2个Url背后有些啥了。 自然而然的Admin就是控制器了,DeleteUser是控制器里面的动作及Action了,1001就是Action的参数。到这里我们对Url路由有一个简单的认识,那么接着看下面一组url,假设Home是控制器,Index是控制器里面的Action,至于1001或者2345这类数据我们暂且约定为参数:
- http://xxx.yyy.com
- http://xxx.yyy.com/Home/1001
- http://xxx.yyy.com/Index/1001
- http://xxx.yyy.com/Home/Index/1001/2345
- http://xxx.yyy.com/System/Home/Index/1001
按照约定,从上面的几组Url中可以看出,有的缺控制器,有的缺Action,有的带有好几个参数,有的又莫名的多出了控制器、Action、参数之外的东西,那么他们能正确的访问吗?
注册路由
在vs2012里面新建一个asp.net mvc4 web 应用程序项目,可以在项目的根目录下App_Start里面看到RouteConfig文件,在这个文件里面就可以添加url路由了。在文件里面可以看到MapRoute 这个方法,它是RouteCollection的扩展方法,并且含有多个重载,下面看看MapRoute方法的参数,这里选参数最多的那个:
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
从上面的代码片段大概可以看出该方法含有路由名称、路由的Url、默认值、约束、首先查找路由所在的命名空间,该方法是返回对映射路由的引用。不过在RouteConfig文件中我们可以看到添加路由的代码:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
稍微分析一下这段代码可以知道,在路由集合里面添加了一个名为"Default"的路由,并且有一个默认的路由指向,指向名称为Home的控制器,并且Action为Index,可以明显的看到这里 "id = UrlParameter.Optional" 的写法,它的意思就是说Action的参数可以不需要用户来指定,可以缺省。
引言
听到路由两字,想必首先想到的会是计算机网络中的路由,通过分组转发来将不同的数据包发送到对应的目的地址。其核心是路由表,表中记录了如何到达各目的地。
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视图。
http://localhost:38226/
http://localhost:38226/Home
http://localhost:38226/Home/Index
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。