ASP.NET Core 路由
在 MVC 框架中,我们有三个组件,每个组件都专注于工作的特定部分。为了使所有这些工作正常,我们需要找到一种方法将这些 HTTP 请求发送到正确的控制器。在 ASP.NET Core MVC 中,此过程称为路由。路由是将 HTTP 请求定向到控制器的过程。
现在让我们了解如何将请求路由到不同的控制器。
- ASP.NET Core 中间件需要一种方法来确定给定的 HTTP 请求是否应发送到控制器进行处理。
- MVC 中间件将根据 URL 和我们提供的一些配置信息做出这个决定。在本章中,我们将定义这个配置信息,或者当我们添加 MVC 中间件时,您可以认为是 Startup.cs 中的路由信息。
- 这种方法通常被称为基于约定的路由。以下是常规路由的代码。
routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");
- 在这种方法中,我们定义了告诉 MVC 如何查看 URL 并找到控制器名称和操作名称的模板,其中控制器是 C# 类,而操作是该类上的公共方法。
在上一章中,我们在应用程序中创建了一个控制器(HomeController),它包含返回字符串的 Index
方法。
public class HomeController:Controller
{
public string Index()
{
return "Hello, World! this message is from Home Controller...";
}
}
在这里,我们将重点讨论到控制器的路由。我们还将尝试了解路由的工作原理。
现在让我们回到 Startup
类,在那里我们将 MVC 中间件配置到应用程序中。在 Configure
方法中,我们使用了 MapControllerRoute
方法。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
这为我们提供了一个默认路由规则,允许我们访问 HomeController
。还需要在 ConfigureServices 中使用 AddControllersWithViews
,以下是 Startup.cs 文件的实现。
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
namespace MyFirstCoreWebApp
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// 此方法由运行时调用。使用此方法将服务添加到容器中。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
//MVC 模式
services.AddControllersWithViews();
}
// 此方法由运行时调用。使用此方法配置 HTTP 请求管道。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
//MVC 常规路由
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
在 MapControllerRoute
方法中,您可以配置路由;路由的目标是描述 ASP.NET Core MVC 将用于处理 HTTP 请求并找到可以响应该请求的控制器的规则。
- 您可以有一个可以将请求映射到不同控制器的路由。
- 我们可以告诉
MapControllerRoute
我们想要映射一条新的路由,它的名称是 "default",然后提供最重要的路由信息,即模板。 - 模板是一个字符串,它将向 ASP.NET Core MVC 描述如何分离 URL。
在上一个实例中,我们添加了一个
HomeController
,因此您也可以请求以下任何 URL,它们也将指向HomeController
上的Index
操作。当浏览器请求 http://mysite/ 或 http://mysite/Home 它从
HomeController
的Index
方法获取输出。- 您也可以通过更改浏览器中的 URL 来尝试此操作。在本例中 http://localhost:20662/, 但端口可能不同。
- 如果将 /Home 或 /Home/Index 附加到 URL 并按下 Enter 按钮,您将看到相同的结果。
- ID 末尾的问号表示此参数是可选的。换句话说,ASP.NET Core MVC 不必在这里看到某种 ID,它可能是数字、字符串或 GUID。
您可以看到应用程序中弹出一条消息。运行中间件,我们之所以收到此消息,是因为 MVC 中间件看到了该 URL。这是对网站根目录的请求,但在 URL 中找不到控制器名称或操作名称。网站的根用户放弃处理该请求,并将请求传递给下一个中间件,即 app.Run 代码。
在默认模板中,如果找不到控制器和操作名,则会应用一些默认值。如果请求来自网站的根目录,则默认控制器名称为 Home。您可以根据需要将其更改为任何其他控制器,默认操作名称可以是 Index。如果需要,还可以更改默认操作,如以下程序所示。
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
如果请求进入网站的根目录,MVC 不会看到控制器/动作类型的 URL,但它可以使用这些默认值。
让我们保存 Startup.cs 文件并将浏览器刷新到网站的根目录。
现在您将看到来自控制器的响应,您还可以转到 /home,它将调用默认操作,即索引。您也可以转到 /home/index,现在 MVC 将从 URL 中提取控制器名称和操作名称。
让我们通过添加另一个类来创建另一个控制器,并将其称为 AboutController。
在这个控制器中,您可以看到两个操作方法 - Phone 和 Country,它们将分别返回一个电话号码和国家名称。稍后我们将进入 HTML。让我们保存此文件并在根 URL 的末尾指定 /about/phone。
您可以看到上面截图中的电话号码。如果指定 /about/country,您也会看到国家的名称。