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 () 方法创建路由表。

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

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

/Home/Index/3

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

  • controller = Home

  • action = Index

  • id = 3

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

HomeController.Index (3)

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

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

/家

由于默认路由参数默认值,输入此 URL 将导致调用清单 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 (索引操作,具有可为 null 的参数)

<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 映射到控制器操作。