[ASP.NET MVC 小牛之路]07 - URL Routing


本文摘自PHP中文网,作者黄舟,侵删。

[ASP.NET
MVC 小牛之路]07 - URL Routing

我们知道在ASP.NET Web Forms中,一个URL请求往往对应一个aspx页面,一个aspx页面就是一个物理文件,它包含对请求的处理。

而在ASP.NET MVC中,一个URL请求是由对应的一个Controller中的Action来处理的,由URL Routing来告诉MVC如何定位到正确的Controller和Action。

笼统的讲,URL Routing包含两个主要功能:解析URL 和 生成URL,本文将围绕这两个大点进行讲解。

本文目录


URL Routing 的定义方式

让我们从下面这样一个简单的URL开始:
http://mysite.com/Admin/Index
在域名的后面,默认使用“/”来对URL进行分段。路由系统通过类似于 {controller}/{action} 格式的字符串可以知道这个URL的 Admin 和 Index 两个片段分别对应Controller和Action的名称。

默认情况下,路由格式中用“/”分隔的段数是和URL域名的后面的段数是一致的,比如,对于{controller}/{action} 格式只会匹配两个片段。如下表所示:

770.png

URL路由是在MVC工程中的App_Start文件夹下的RouteConfig.cs文件中的RegisterRoutes方法中定义的,下面是创建一个空MVC项目时系统生成的一个简单URL路由定义:

1

2

3

4

5

6

7

8

9

public static void RegisterRoutes(RouteCollection routes) {

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 

    routes.MapRoute(

        name: "Default",

        url: "{controller}/{action}/{id}",

        defaults: new { controller = "Home", action = "Index",  id = UrlParameter.Optional }

    );

}

静态方法RegisterRoutes是在Global.asax.cs文件中的Application_Start方法中被调用的,除了URL路由的定义外,还包含其他的一些MVC核心特性的定义:

1

2

3

4

5

6

7

8

protected void Application_Start() {

    AreaRegistration.RegisterAllAreas();

 

    WebApiConfig.Register(GlobalConfiguration.Configuration);

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

    RouteConfig.RegisterRoutes(RouteTable.Routes);

    BundleConfig.RegisterBundles(BundleTable.Bundles);

}


RouteConfig.RegisterRoutes方法中传递的是 RouteTable 类的静态 Routes 属性,返回一个RouteCollection的实例。其实,“原始”的定义路由的方法可以这样写:

1

2

3

4

5

public static void RegisterRoutes(RouteCollection routes) {

 

    Route myRoute = new Route("{controller}/{action}", new MvcRouteHandler());

    routes.Add("MyRoute", myRoute);

}

创建Route对象时用了一个URL格式字符串和一个MvcRouteHandler对象作为构造函数的参数。不同的ASP.NET技术有不同的RouteHandler,MVC用的是MvcRouteHandler。

这种写法有点繁琐,一种更简单的定义方法是:

1

2

3

4

public static void RegisterRoutes(RouteCollection routes) {

 

    routes.MapRoute("MyRoute", "{controller}/{action}");

}

这种方法简洁易读,一般我们都会用这种方法定义路由。

示例准备

作为演示,我们先来准备一个Demo。创建一个标准的MVC应用程序,然后添加三个简单的Controller,分别是HomeController、CustomerController和AdminController,代码如下:


HomeController


CustomerController


AdminController

在 /Views/Shared 文件夹下再给这三个Controller添加一个共享的名为 ActionName.cshtml 的 View,代码如下:


ActionName.cshtml

我们把RouteConfig.cs文件中项目自动生成的URL Rounting的定义删了,然后根据前面讲的路由定义知识,我们自己写一个最简单的:

1

2

3

4

public static void RegisterRoutes(RouteCollection routes) {

 

    routes.MapRoute("MyRoute", "{controller}/{action}");

}

程序运行,URL定位到 Admin/Index 看看运行结果:

771.png

这个Demo输出的是被调用的Controller和Action名称。

给片段变量定义默认值

相关阅读 >>

asp.net core应用程序在linux上部署的图文详解

解析asp.net如何使用session

asp.net控制文件上传的大小方法(超简单)_实用技巧

asp.net core project.json文件(5)_实用技巧

asp.net一些经典的问题详解

asp.net函数总结

asp.net页脚制作详解

asp.net实现简单数字验证码实例

浅析asp.net页面缓存技术

asp.net常用函数总结

更多相关阅读请进入《asp.net》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...