ASP.NET MVC 路由概述 (VB)

作者 :Stephen Walther

在本教程中,Stephen Walther 演示如何 ASP.NET MVC 框架将浏览器请求映射到控制器操作。

在本教程中,将介绍每个 ASP.NET MVC 应用程序的重要功能,称为 ASP.NET 路由。 ASP.NET 路由模块负责将传入浏览器请求映射到特定的 MVC 控制器操作。 本教程结束时,你将了解标准路由表如何将请求映射到控制器操作。

使用默认路由表

创建新的 ASP.NET MVC 应用程序时,该应用程序已配置为使用 ASP.NET 路由。 ASP.NET 路由在两个位置进行设置。

首先,ASP.NET 路由在应用程序的 Web 配置文件 (Web.config 文件中启用) 。 配置文件中有四个部分与路由相关:system.web.httpModules 节、system.web.httpHandlers 节、system.webserver.modules 节和 system.webserver.handlers 节。 请注意不要删除这些分区,因为如果没有这些节路由将不再有效。

其次,更重要的是,路由表是在应用程序的 Global.asax 文件中创建的。 Global.asax 文件是一个特殊文件,其中包含 ASP.NET 应用程序生命周期事件的事件处理程序。 路由表是在应用程序启动事件期间创建的。

一览 1 中的文件包含 ASP.NET MVC 应用程序的默认 Global.asax 文件。

列出 1 - Global.asax.vb

' Note: For instructions on enabling IIS6 or IIS7 classic mode, 
' visit https://go.microsoft.com/?LinkId=9394802

Public Class MvcApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

        ' MapRoute takes the following parameters, in order:
        ' (1) Route name
        ' (2) URL with parameters
        ' (3) Parameter defaults
        routes.MapRoute( _
            "Default", _
            "{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = ""} _
        )

    End Sub

    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

首次启动 MVC 应用程序时,将调用 Application_Start () 方法。 此方法又调用 RegisterRoutes () 方法。 RegisterRoutes () 方法创建路由表。

默认路由表包含名为 Default) 的单个路由 (。 默认路由将 URL 的第一段映射到控制器名称,将 URL 的第二段映射到控制器操作,第三个段映射到名为 ID 的参数。

假设在 Web 浏览器的地址栏中输入以下 URL:

/Home/Index/3

默认路由将此 URL 映射到以下参数:

  • controller = Home

  • action = Index

  • id = 3

请求 URL /Home/Index/3 时,将执行以下代码:

HomeController.Index (3)

默认路由包括所有三个参数的默认值。 如果未提供控制器,则控制器参数默认为 “开始”值。 如果未提供操作,则操作参数默认为值 Index。 最后,如果未提供 ID,ID 参数默认为空字符串。

让我们看看一些示例,了解默认路由如何将 URL 映射到控制器操作。 假设在浏览器地址栏中输入以下 URL:

/Home

由于默认路由参数默认值,输入此 URL 将导致调用 List 2 中 HomeController 类的 Index () 方法。

列表 2 - HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id As String)
        Return View()
    End Function

End Class

在一览 2 中,HomeController 类包含一个名为 Index () 的方法,该方法接受名为 Id 的单个参数。URL /Home 导致调用 Index () 方法,其值为 Nothing 作为 ID 参数的值。

由于 MVC 框架调用控制器操作的方式,URL /Home 还与一览 3 中的 HomeController 类的 Index () 方法匹配。

列出 3 - HomeController.vb (索引操作,没有参数)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index()
        Return View()
    End Function

End Class

一览 3 中的 Index () 方法不接受任何参数。 URL /Home 将导致调用此 Index () 方法。 URL /Home/Index/3 还会调用此方法, (id 被忽略) 。

URL /Home 还与一览 4 中的 HomeController 类的 Index () 方法匹配。

列出 4 - HomeController.vb (索引操作,)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id? As Integer)
        Return View()
    End Function

End Class

在一览 4 中,Index () 方法具有一个 Integer 参数。 由于参数是可为 null 的参数, (可以具有值 Nothing) ,因此可以调用 Index () 而不引发错误。

最后,使用 URL /Home 调用一览 5 中的 Index () 方法会导致异常,因为 Id 参数 不是 可为 null 的参数。 如果尝试调用 Index () 方法,则会看到图 1 中显示的错误。

列出 5 - HomeController.vb (Id 参数) 索引操作

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id As Integer)
        Return View()
    End Function

End Class

调用需要参数值的控制器操作

图 01:调用需要参数值的控制器操作 (单击以查看全尺寸图像)

另一方面,URL /Home/Index/3 与列表 5 中的索引控制器操作一起使用。 请求 /Home/Index/3 会导致使用值为 3 的 Id 参数调用 Index () 方法。

总结

本教程的目的是简要介绍 ASP.NET 路由。 我们检查了使用新 ASP.NET MVC 应用程序获取的默认路由表。 你了解了默认路由如何将 URL 映射到控制器操作。