https://blog.csdn.net/u011966339/article/details/79387818
ASP.NET引入了路由,以消除将每个URL映射到物理文件的需求。路由使我们能够定义映射到请求处理程序的URL模式。这个请求处理程序可以是一个文件或类。
路由:
路由定义了URL模式和处理程序信息。存储在RouteTable中的应用程序的所有已配置路由将由路由引擎用于为传入请求确定适当的处理程序类或文件。
配置路由:
每个MVC应用程序必须配置(注册)至少一个默认由MVC框架配置的路由。您可以在RouteConfig类中注册路由,该路由位于App_Start文件夹下的RouteConfig.cs中。下图说明了如何在RouteConfig类中配置路由。
URL模式:
URL模式仅在URL中的域名部分之后被考虑。例如,网址格式“{controller}/{action}/{id}”看起来像localhost:1234/{controller}/{action}/ {id}。“localhost:1234 /”之后的任何内容都将被视为控制器名称。同样,控制器名称之后的任何内容都将被视为操作名称,然后是id参数的值。
多重路由
使用MapRoute扩展方法配置自定义路由。在MapRoute中提供至少两个参数,路由名称和url模式。Defaults参数是可选的。你可以注册具有不同名称的多个自定义路由。考虑下面的例子,我们注册“学生”路由。
示例:自定义路由
[csharp] view plain copy
- <span style="font-family:KaiTi_GB2312;font-size:18px;">public class RouteConfig
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- routes.MapRoute(
- name: "Student",
- url: "students/{id}",
- defaults: new { controller = "Student", action = "Index"}
- );
- routes.MapRoute(
- name: "Default",
- url: "{controller}/{action}/{id}",
- defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
- );
- }
- }
- </span>
如上面的代码所示,Student路由的URL模式是students/{id},它指定任何以domainName/students开头的URL都必须由StudentController处理。请注意,我们还没有在URL模式中指定{action},因为我们希望每个以student开头的URL都应该使用StudentController的Index操作。我们已经指定了默认的控制器和动作来处理从域名/学生开始的任何URL请求。
MVC框架按顺序评估每个路由。它从第一个配置的路由开始,如果传入的url不符合路由的URL模式,那么它将评估第二个路由等等。在上面的例子中,路由引擎将首先评估students路由,如果传入的网址不是以/students开始,那么只有它将考虑作为默认路由的第二路由。
路由约束:
通过配置路由约束来限制参数的值。例如,以下路由对id参数应用限制,即id的值必须是数字。
[html] view plain copy
- <span style="font-family:KaiTi_GB2312;font-size:18px;">routes.MapRoute(
- name: "Student",
- url: "student/{id}/{name}/{standardId}",
- defaults: new { controller = "Student", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional, standardId = UrlParameter.Optional },
- constraints: new { id = @"\d+" }
- );</span>
如果你给id参数的非数字值,那么这个请求将被另一个路由处理,或者如果没有匹配的路由,则会抛出“The resource could not be found”错误。
注册路由
在配置RouteConfig类中的所有路由之后,需要将其注册到Global.asax的Application_Start()事件中。这样它就可以将所有的路由包含到RouteTable中。
[csharp] view plain copy
- <span style="font-family:KaiTi_GB2312;font-size:18px;">public class MvcApplication : System.Web.HttpApplication
- {
- protected void Application_Start()
- {
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- }
- }</span>
下面表示注册路由的过程
小结
要点:
(1)路由在MVC框架中起着重要的作用。将URL映射到物理文件或类(MVC中的控制器类)。
(2)路由包含URL模式和处理程序信息。网址格式在域名后面开始。
(3)路由可以在RouteConfig类中配置。还可以配置多个自定义路由。
(4)路由约束对参数的值应用限制。
(5)路由必须在Global.ascx.cs文件的Application_Start事件中注册。
https://blog.csdn.net/slowlifes/article/details/72461440
1、规则名:Default
2、URL分段:{controller}/{action}/{id},分别有三段,第一段对应controller参数,第段为action参数,第三段为id参数
3、URL段的默认值:controller为Home,action为Index,id = UrlParameter.Optional表示该参数为可选的。
之所以我们访问http://www.xx.com/ 这样的URL网址能正确返回,是因为我们设置了URL段的默认值,相当于访问:
http://www.xx.com/Home/Index
1、Controller命名约定
Controller类必须以Controller结尾,比如:HomeController,ProductController。我们在页面上用HTML heper来引用一个Controller的时只需要前面Home,Product就可以,ASP.NET MVC框架自带的DefaultControllerFactory自动为我们在结尾加上Controller,并开始根据这个名字开始找对应的类。我们创建一个ASP.NET MVC项目新加的Controller,文件会自动放在根目录的Controllers文件夹里面,我们刚开始可以看到有一个HomeController.cs。当然你也可以实现接口IControllerFactory,定义自己的ControllerFactory来改变查找Controller文件的行为。我会再以后的文章中介绍。
2、View命名约定
ASP.NET MVC的视图View默认情况是放在根目录的Views文件下的,规则是这样的:/Views/ControllerName/ActionName.cshtml。比如:HomeController的Action名字为Index的视图对应文件为:/Views/Home/Index.cshtml
因此是通过Controller和Action的名字来确定视图文件的位置的。采用这个命名约定的好处是在Action返回视图的时候会MVC框架会按照这个约定找到默认的视图文件。比如在ProductController的Action方法List最后是这样的代码:
return View();
会自动去路径,/Views/Product/找文件List.cshtml(或者List.aspx如果使用的老的视图引擎)。
当然也可以指定视图的名字:
return View("~/Views/Product/List.cshtml")
或者
return View("MyOtherView")
MVC框架在查找具体的默认视图文件时,如果在/Views/ControllerName/下面没有找到,会再在/Views/Shared下面找,如果都没找到就会找错:找不到视图。
上面表示URL规则是:
{controller}/{action}
这个路由规则有两个段,第一个是controller,第二个是action。声明url段每个部分要且{}括起来,相当于占位符,是变量。
当一个URL请求到来的时候MVC路由系统就负责把它匹配到一个具体的路由规则,并把URL每段的值提取出来。这里说“一个具体的路由规则”,是因为可能会注册多个路由规则,MVC路由系统会根据注册顺序一个一个的查找匹配,直到到为止。
默认情况,URL路由规则只匹配与之有相同URL段数量的URL。如下表:
URL | URL段 |
http://mysite.com/Admin/Index | controller = Admin action = Index |
http://mysite.com/Index/Admin | controller = Index action = Admin |
http://mysite.com/Apples/Oranges | controller = Apples action = Oranges |
http://mysite.com/Admin | 无匹配-段的数量不够 |
http://mysite.com/Admin/Index/Soccer | 无匹配-段的数量超了 |
四、mvc创建一个简单的Route规则
我们在前面注册路由规则都是通过下面的方式:
1 public static void RegisterRoutes(RouteCollection routes) {
2
3 routes.MapRoute("MyRoute", "{controller}/{action}");
4 }
用到了RouteCollection的MapRoute方法。其实我们还可以调用 Add方法,传一个Route的实例给它一样的达到相同的效果。
1 public static void RegisterRoutes(RouteCollection routes) {
2
3 Route myRoute = new Route("{controller}/{action}", new MvcRouteHandler());
4 routes.Add("MyRoute", myRoute);
5 }
五、mvc路由的默认值的设定
之前有说:URL路由规则只匹配与之有相同URL段数量的URL,这种是严格,但是我们又想有些段不用输入,让用户进入指定的页面。像,http://www.xx.com/Home/就是进入进入Home的Index。只需要设定mvc路由的默认值就可以了。
1 public static void RegisterRoutes(RouteCollection routes) {
2 routes.MapRoute("MyRoute", "{controller}/{action}", new { action = "Index" });
3 }
要设置Controller和Action的默认值。
1 public static void RegisterRoutes(RouteCollection routes) {
2
3 routes.MapRoute("MyRoute", "{controller}/{action}",
4 new { controller = "Home", action = "Index" });
5 }
下面是一个具体的Url对应的Route映射。
Url段的数量 | 实例 | Route映射 |
0 | mydomain.com | controller = Home action = Index |
1 | mydomain.com/Customer | controller = Customer action = Index |
2 | mydomain.com/Customer/List | controller = Customer action = List |
3 | mydomain.com/Customer/List/All | 无匹配—Url段过多 |
六、mvc使用静态URL段
前面定义路由规则都是占位符的形式,{controller}/{action},我们也可以使用在使用静态字符串。如:
1 public static void RegisterRoutes(RouteCollection routes) {
2
3 routes.MapRoute("MyRoute", "{controller}/{action}",
4 new { controller = "Home", action = "Index" });
5
6 routes.MapRoute("", "Public/{controller}/{action}",
7 new { controller = "Home", action = "Index" });
8 }
上面匹配:http://mydomain.com/Public/Home/Index
路由:"Public/{controller}/{action}"只匹配有三段的url,第一段必须为Public,第二和第三可以是任何值,分别用于controller和action。
除此这外,路由规则中可以既包含静态和变量的混合URL段,如:
1 public static void RegisterRoutes(RouteCollection routes) {
2
3 routes.MapRoute("", "X{controller}/{action}");
4
5 routes.MapRoute("MyRoute", "{controller}/{action}",
6 new { controller = "Home", action = "Index" });
7
8 routes.MapRoute("", "Public/{controller}/{action}",
9 new { controller = "Home", action = "Index" });
10
11 }