ASP.NET MVC 路由概述 (C#)

作者 :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.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit https://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

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。 如果未提供操作,则 action 参数默认 为 Index 值。 最后,如果不提供 ID,则 id 参数默认为空字符串。

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

/家

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

清单 2 - HomeController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(string id)
        {
            return View();
        }
    }
}

在清单 2 中,HomeController 类包括一个名为 Index () 的方法,该方法接受名为 Id 的单个参数。URL /Home 会导致使用空字符串作为 Id 参数的值调用 Index () 方法。

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

清单 3 - HomeController.cs (索引操作,没有参数)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

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

URL /Home 还匹配清单 4 中 HomeController 类的 Index () 方法。

清单 4 - HomeController.cs (Index 操作,其中包含可为 null 的参数)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int? id)
        {
            return View();
        }
    }
}

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

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

清单 5 - HomeController.cs (具有 Id 参数的索引操作)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int id)
        {
            return View();
        }
    }
}

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

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

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

总结

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