ASP.NET Core 路由

在 MVC 框架中,我们有三个组件,每个组件都专注于工作的特定部分。为了使所有这些工作正常,我们需要找到一种方法将这些 HTTP 请求发送到正确的控制器。在 ASP.NET Core MVC 中,此过程称为路由。路由是将 HTTP 请求定向到控制器的过程。

现在让我们了解如何将请求路由到不同的控制器。

  • ASP.NET Core 中间件需要一种方法来确定给定的 HTTP 请求是否应发送到控制器进行处理。
  • MVC 中间件将根据 URL 和我们提供的一些配置信息做出这个决定。在本章中,我们将定义这个配置信息,或者当我们添加 MVC 中间件时,您可以认为是 Startup.cs 中的路由信息。
  • 这种方法通常被称为基于约定的路由。以下是常规路由的代码。
  1. routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");
  • 在这种方法中,我们定义了告诉 MVC 如何查看 URL 并找到控制器名称和操作名称的模板,其中控制器是 C# 类,而操作是该类上的公共方法。

在上一章中,我们在应用程序中创建了一个控制器(HomeController),它包含返回字符串的 Index 方法。

  1. public class HomeController:Controller
  2. {
  3. public string Index()
  4. {
  5. return "Hello, World! this message is from Home Controller...";
  6. }
  7. }

在这里,我们将重点讨论到控制器的路由。我们还将尝试了解路由的工作原理。

现在让我们回到 Startup 类,在那里我们将 MVC 中间件配置到应用程序中。在 Configure 方法中,我们使用了 MapControllerRoute 方法。

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseExceptionHandler("/Error");
  10. }
  11. app.UseStaticFiles();
  12. app.UseRouting();
  13. app.UseAuthorization();
  14. app.UseEndpoints(endpoints =>
  15. {
  16. endpoints.MapControllerRoute(
  17. name: "default",
  18. pattern: "{controller=Home}/{action=Index}/{id?}");
  19. });
  20. }

这为我们提供了一个默认路由规则,允许我们访问 HomeController。还需要在 ConfigureServices 中使用 AddControllersWithViews,以下是 Startup.cs 文件的实现。

  1. using Microsoft.AspNet.Builder;
  2. using Microsoft.AspNet.Hosting;
  3. using Microsoft.AspNet.Http;
  4. using Microsoft.Extensions.DependencyInjection;
  5. using Microsoft.Extensions.Configuration;
  6. namespace MyFirstCoreWebApp
  7. {
  8. public class Startup
  9. {
  10. public Startup(IConfiguration configuration)
  11. {
  12. Configuration = configuration;
  13. }
  14. public IConfiguration Configuration { get; }
  15. // 此方法由运行时调用。使用此方法将服务添加到容器中。
  16. public void ConfigureServices(IServiceCollection services)
  17. {
  18. services.AddRazorPages();
  19. //MVC 模式
  20. services.AddControllersWithViews();
  21. }
  22. // 此方法由运行时调用。使用此方法配置 HTTP 请求管道。
  23. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  24. {
  25. if (env.IsDevelopment())
  26. {
  27. app.UseDeveloperExceptionPage();
  28. }
  29. else
  30. {
  31. app.UseExceptionHandler("/Error");
  32. }
  33. app.UseStaticFiles();
  34. app.UseRouting();
  35. app.UseAuthorization();
  36. //MVC 常规路由
  37. app.UseEndpoints(endpoints =>
  38. {
  39. endpoints.MapControllerRoute(
  40. name: "default",
  41. pattern: "{controller=Home}/{action=Index}/{id?}");
  42. });
  43. }
  44. }
  45. }

MapControllerRoute 方法中,您可以配置路由;路由的目标是描述 ASP.NET Core MVC 将用于处理 HTTP 请求并找到可以响应该请求的控制器的规则。

  • 您可以有一个可以将请求映射到不同控制器的路由。
  • 我们可以告诉 MapControllerRoute 我们想要映射一条新的路由,它的名称是 "default",然后提供最重要的路由信息,即模板。
  • 模板是一个字符串,它将向 ASP.NET Core MVC 描述如何分离 URL。
  • 在上一个实例中,我们添加了一个 HomeController,因此您也可以请求以下任何 URL,它们也将指向 HomeController 上的 Index 操作。

  • 当浏览器请求 http://mysite/http://mysite/Home 它从 HomeControllerIndex 方法获取输出。

  • 您也可以通过更改浏览器中的 URL 来尝试此操作。在本例中 http://localhost:20662/, 但端口可能不同。
  • 如果将 /Home/Home/Index 附加到 URL 并按下 Enter 按钮,您将看到相同的结果。
  • ID 末尾的问号表示此参数是可选的。换句话说,ASP.NET Core MVC 不必在这里看到某种 ID,它可能是数字、字符串或 GUID。

您可以看到应用程序中弹出一条消息。运行中间件,我们之所以收到此消息,是因为 MVC 中间件看到了该 URL。这是对网站根目录的请求,但在 URL 中找不到控制器名称或操作名称。网站的根用户放弃处理该请求,并将请求传递给下一个中间件,即 app.Run 代码。

在默认模板中,如果找不到控制器和操作名,则会应用一些默认值。如果请求来自网站的根目录,则默认控制器名称为 Home。您可以根据需要将其更改为任何其他控制器,默认操作名称可以是 Index。如果需要,还可以更改默认操作,如以下程序所示。

  1. endpoints.MapControllerRoute(
  2. name: "default",
  3. pattern: "{controller=Home}/{action=Index}/{id?}");

如果请求进入网站的根目录,MVC 不会看到控制器/动作类型的 URL,但它可以使用这些默认值。

让我们保存 Startup.cs 文件并将浏览器刷新到网站的根目录。

现在您将看到来自控制器的响应,您还可以转到 /home,它将调用默认操作,即索引。您也可以转到 /home/index,现在 MVC 将从 URL 中提取控制器名称和操作名称。

让我们通过添加另一个类来创建另一个控制器,并将其称为 AboutController

在这个控制器中,您可以看到两个操作方法 - Phone 和 Country,它们将分别返回一个电话号码和国家名称。稍后我们将进入 HTML。让我们保存此文件并在根 URL 的末尾指定 /about/phone

您可以看到上面截图中的电话号码。如果指定 /about/country,您也会看到国家的名称。