ASP.NET MVC - 路由

路由是将 HTTP 请求定向到控制器的过程,此处理的功能在 System.Web.Routing 中实现。 此程序集不是 ASP.NET MVC 的一部分。 它实际上是 ASP.NET 运行时的一部分,并作为 .NET 3.5 SP1 与 ASP.NET 一起正式发布。

System.Web.Routing 由 MVC 框架使用,但也由 ASP.NET 动态数据使用。 MVC 框架利用路由将请求定向到控制器。 Global.asax 文件是应用程序的一部分,您将在其中定义应用程序的路由。

这是我们在上一章中创建的 MVC 应用程序中 Global.asax 中应用程序启动事件的代码。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCFirstApp {
   public class MvcApplication : System.Web.HttpApplication {
      protected void Application_Start(){
         AreaRegistration.RegisterAllAreas();
         RouteConfig.RegisterRoutes(RouteTable.Routes);
      }
   }
}

下面是RouteConfig类的实现,其中包含一个方法RegisterRoutes。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCFirstApp {
   public class RouteConfig {
      public static void RegisterRoutes(RouteCollection routes){
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
         routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new{ controller = "Home", action = "Index", id = UrlParameter.Optional});
      }
   }
}

您将定义路由,这些路由会将 URL 映射到特定的控制器操作。 动作只是控制器上的一个方法。 它还可以从该 URL 中选取参数并将它们作为参数传递到方法中。

所以应用程序中定义的这个路由是默认路由。 如上面的代码所示,当您看到 URL 以 (something)/(something)/(something) 的形式到达时,那么第一部分是控制器名称,第二部分是操作名称,第三部分是 ID 参数。

了解路由

MVC 应用程序使用 ASP.NET 路由系统,该系统决定 URL 如何映射到控制器和操作。

当 Visual Studio 创建 MVC 项目时,它会添加一些默认路由来帮助我们开始。 当您运行应用程序时,您将看到 Visual Studio 已将浏览器定向到端口 63664。您几乎肯定会在浏览器请求的 URL 中看到不同的端口号,因为 Visual Studio 在创建项目时分配了一个随机端口。

Localhost主页

在上一个示例中,我们添加了一个 HomeController,因此您还可以请求以下任何 URL,它们将被定向到 HomeController 上的 Index 操作。

http://localhost:63664/Home/

http://localhost:63664/Home/Index

当浏览器请求 http://mysite/ 或 http://mysite/Home 时,它会从 HomeController 的 Index 方法获取输出。

您也可以通过更改浏览器中的 URL 来尝试此操作。 在此示例中,它是 http://localhost:63664/,但端口可能不同。

如果将 /Home 或 /Home/Index 附加到 URL 并按"Enter"按钮,您将从 MVC 应用程序中看到相同的结果。

Localhost主目录Index

正如您在本例中所看到的,约定是我们有一个名为 HomeController 的控制器,并且此 HomeController 将成为我们的 MVC 应用程序的起点。

Visual Studio 为新项目创建的默认路由假定您将遵循此约定。 但如果您想遵循自己的约定,那么您需要修改路线。

自定义约定

您当然可以添加自己的路线。 如果您不喜欢这些操作名称,如果您有不同的 ID 参数,或者您的网站通常有不同的 URL 结构,那么您可以添加自己的路由条目。

让我们看一个简单的例子。 假设我们有一个包含进程列表的页面。 以下是代码,它将路由到 Process 页面。

routes.MapRoute(
   "Process",
   "Process/{action}/{id}",
   defaults: new{
      controller = "Process", action = "List ", id = UrlParameter.Optional}
);

当有人进来并查找带有 Process/Action/Id 的 URL 时,他们将转到 Process Controller。 我们可以使操作稍微不同,默认操作,我们可以将其设为List而不是Index。

现在到达的请求看起来像 localhosts/process。 路由引擎将使用此路由配置来传递它,因此它将使用默认操作 List。

以下是完整的类实现。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCFirstApp{
   public class RouteConfig{
      public static void RegisterRoutes(RouteCollection routes){
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
			
         routes.MapRoute(
            "Process", "Process/{action}/{id}",
            defaults: new{
               controller = " Process", action = "List ", id =
               UrlParameter.Optional});
					
         routes.MapRoute(
            name: "Default", url: "{controller}/{action}/{id}",
            defaults: new{
               controller = "Home", action = "Index", id =
               UrlParameter.Optional});
      }
   }
}

步骤 1 − 运行此程序并使用以下 URL http://localhost:63664/Process

请求流程页面 Localhost进程

您将看到 HTTP 404,因为路由引擎正在寻找不可用的 ProcessController。

步骤 2 − 通过右键单击解决方案资源管理器中的 Controllers 文件夹并选择 Add → Controller 创建 ProcessController。

创建 ProcessController

它将显示“添加控制器”对话框。

ProcessController 控制器对话框

步骤 3 − 选择 MVC 5 Controller – Empty 选项并单击"Add"按钮。

将出现"添加控制器"对话框。

空选项添加按钮

步骤 4 − 将名称设置为 ProcessController 并单击"添加"按钮。

现在您将在 Controllers 文件夹中看到一个新的 C# 文件 ProcessController.cs,该文件也可在 Visual Studio 中打开以供编辑。

设置 ProcessController

现在我们的默认操作将是"列表",因此我们希望在此处使用"List"操作而不是"List"。

步骤 5 − 将返回类型从 ActionResult 更改为字符串,并使用以下代码从此操作方法返回一些字符串。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFirstApp.Controllers{
   public class ProcessController : Controller{
      // GET: Process
      public string List(){
         return "This is Process page";
      }
   }
}

步骤 6 − 当您运行此应用程序时,您将再次看到默认路由的结果。 当您指定以下 URL:http://localhost:63664/Process/List 时,您将看到 ProcessController 的结果。

Localhost Process List