ASP.NET MVC 路由概述 (VB)

作者: Stephen Walther

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

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

使用默认路由表

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

首先,在应用程序的 Web 配置文件中启用 ASP.NET 路由 (Web.config 文件) 。 配置文件中存在四个与路由相关的部分: system.web 节、httpHandlers 节、system.webserver. 模块部分和 system.webserver. 处理程序部分。 "的配置文件。 请注意不要删除这些部分,因为没有这些章节,路由将不再工作。

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

列表1中的文件包含 ASP.NET MVC 应用程序的默认 global.asax 文件。

列表 1-global.asax

' 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的参数。

Imagine 在 web 浏览器的地址栏中输入以下 URL:

/Home/Index/3

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

  • 控制器 = Home

  • 操作 = 索引

  • id = 3

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

HomeController (3)

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

让我们看几个有关默认路由如何将 Url 映射到控制器操作的示例。 Imagine 你在浏览器地址栏中输入以下 URL:

/Home

由于默认路由参数为默认值,因此输入此 URL 将导致调用清单2中 HomeController 类的索引 () 方法。

列表 2-HomeController

<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 使索引 () 方法的调用方式与 Id 参数的值无关。

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

列出 HomeController (索引操作,不含参数)

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

    Function Index()
        Return View()
    End Function

End Class

清单3中的索引 () 方法不接受任何参数。 URL/Home 将导致调用此索引 () 方法。 URL/Home/Index/3 还会调用此方法 (忽略) 的 Id。

URL/Home 还匹配列表4中 HomeController 类的索引 () 方法。

列表 4-HomeController 参数为 null 的 (索引操作)

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

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

End Class

在列表4中,索引 () 方法有一个整数参数。 由于参数是可以为 null 的参数 (可以将值设置为 Nothing) ,因此可以调用索引 () ,而不会引发错误。

最后,在使用 URL/Home 的列表5中调用 Index () 方法将导致异常,因为 Id 参数 是可以为 null 的参数。 如果尝试调用索引 () 方法,则会收到如图1所示的错误。

列出 HomeController (索引操作,Id 参数)

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

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

End Class

Invoking a controller action that expects a parameter value

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

另一方面,URL/Home/Index/3 的工作方式与清单5中的索引控制器操作非常相似。 请求/Home/Index/3 导致使用值为3的 Id 参数调用索引 () 方法。

总结

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