(译)ASP.NET MVC Routing 概述

ASP.NET MVC Routing 概述

在本篇教程中,你将会了解到 ASP.NET MVC 中一个重要的组件。这个组件叫做 ASP.NET Routing,它负责将客户端请求的路径映射到特定的一个类(Controller)的一个函数(Action)。并且在教程的结尾,你将会掌握一个标准路由是如何映射到特定类的特定函数。

使用默认的路由表

当你创建一个新的 ASP.NET MVC 应用程序的时候,就已经默认地在两个地方配置了 ASP.NET Routing

首先,你可以在应用程序的配置文件(Web.config)找到与 ASP.NET Routing 有关的配置。这些节点如下所示:

l  system.web.httpModules

l  system.web.httpHandlers

l  system.webserver.modules

l  system.webserver.handlers section

在没有了解他们之前,请不要随意的更改或删除他们,否则可能导致你的应用程序或 ASP.NET Routing无法正常的工作。

其次更为重要的是,一张路由表是在全局文件(Global.asax)中创建的。这个特殊文件包含了ASP.NET 应用程序生命周期以及一些HTTP处理的事件。例如我们关注的路由表就是在 Application_Start事件中创建的。

Listing 1 – ~/Global.asax.cs

using System.Web.Mvc;

using System.Web.Routing;

namespace MVCTestDemo

{

    public class MvcApplication : System.Web.HttpApplication

    {

        public static void RegisterRoutes(RouteCollection routes)

        {

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

            routes.MapRoute(

                "Default",                                              // 路由名

                "{controller}/{action}/{id}",                           // URL参数

                new { controller = "Home", action = "Index", id = "" }  // 默认值

            );

        }

        protected void Application_Start()

        {

            RegisterRoutes(RouteTable.Routes);

        }

    }

}

当你的 ASPNET MVC应用程序首次启动的时,Application_Start()将会被系统自动调用。这个函数调用了一个静态函数RegisterRoutes(),从代码中可以看出,这个函数创建了一个路由表

让我们来分析下 RegisterRoutes() 函数,这个函数包含了一个名为 Default 的路由器,这个路由器映射的第一部分是 Url Controller 名称。第二个部分将指示要访问这个 Controller下的哪一个 Action。而最后一个 id,则是指示要传递给 Action 的参数。

想像一下,当你在浏览器中键入如下所示的 URL 地址(除了主机和端口):

/Home/Index/3

聪明的你可能已经看出,这样的地址意味着如下:

controller = Home

action = Index

id = 3

没错,参照上面的代码,当你请求这样的URL时,就是这样的“解释”的。更深一步,这样的URL地址,就像是客户端调用了这样的函数。

HomeController.Index(3)

当然,这样只是一个示例。准确的说,前面的HomeController是一个我们定义的类,这个类包含一个Index( int id ) 函数。当运行的时候,ASP.NET MVC将会实例化一个HomeController,从而调用,并传递参数。

再来尝试一下,当你在请求这样的地址呢?

/Home

很显然,你并没有给予系统Actionid部分。这个时候,我们回顾下上面的Listing 1的代码清单。是的,很清晰的告诉系统:

l  当没有Controller时,将这个部分默认Home

l  当没有Action时,将这个部分默认Index

l  最后,当没有给定id时,将会默认一个空的字符串。

如果你没有理解这个部分,你参考下Listing 2的代码。

Listing 2 – ~/Controllers/HomeController.cs

using System.Web.Mvc;

namespace MVCTestDemo.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        public ActionResult Index(string id)

        {

            return View();

        }

    }

}

代码 Listing 2 部分,便是ASP.NET MVC C C,就是ControllerASP.NET 的命名规则就是NameController

请求 /Home/Index/3 这样的 URL ,则调用的是 HomeController.Index( 3 )

同理,倘若请求 /Test/About/3,自然调用的是TestController.About(3)

不过,当你请求 /Home/Index/3 时,不一定要对这个参数3“负责”。你可以完全无视参数。Listing 3 可以清晰的表示。对于非ControllerAction的部分,你可以选择“爱理不理”。

Listing 3 – ~/Controllers/HomeController.cs

using System.Web.Mvc;

namespace MVCTestDemo.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        public ActionResult Index()

        {

            return View();

        }

    }

}

根据我们注册的路由表,可以得知:在默认的情况下,当我们请求/Home路径的时候,视同调用了这样的函数(当参数为string数据类型时,参考代码Listing 2):

HomeController.Index(String.Empty)

当然,从字面上可以理解配置的参数(id)明显是一个整型。你完全可以选择使用int来作为数据类型。但是请注意,我们所配置的是一个默认为空字符串的id,如果你仅仅使用整型,将会抛出异常(无法将null转换为Int32),你完全可以使用可空类型(int?)。

转载于:https://www.cnblogs.com/sofire/articles/1603541.html

Guess you like

Origin blog.csdn.net/weixin_33801856/article/details/92637863