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# 类,action 操作是该类的公共方法。
在上一章中,我们在应用程序中创建了一个控制器(HomeController),它是一个 C# 类,不需要从基类派生,也不需要实现接口或具有任何特殊属性。 它是一个普通的 C# 类,名称为 HomeController,它包含返回字符串的 Index 方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace FirstAppdemo.Controllers {
public class HomeController {
public string Index() {
return "Hello, World! this message is from Home Controller...";
}
}
}
在这里,我们将重点关注路由到控制器。 我们还将尝试了解路由的工作原理。
现在让我们回到 Startup 类,我们在其中将 MVC 中间件配置到我们的应用程序中。 在 Configure 方法中,我们使用了方法 UseMvcWithDefaultRoute。
public void Configure(IApplicationBuilder app) {
app.UseIISPlatformHandler();
app.UseDeveloperExceptionPage();
app.UseRuntimeInfoPage();
app.UseFileServer();
app.UseMvcWithDefaultRoute();
app.Run(async (context) => {
var msg = Configuration["message"];
await context.Response.WriteAsync(msg);
});
}
这为我们提供了一个默认路由规则,允许我们到达 HomeController。我们不使用 UseMvcWithDefaultRoute,而是使用 UseMvc,然后在此时使用命名方法 ConfigureRoute 配置路由。以下是 Startup.cs 文件的实现。
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNet.Routing;
using System;
namespace FirstAppDemo {
public class Startup {
public Startup() {
var builder = new ConfigurationBuilder() .AddJsonFile("AppSettings.json");
Configuration = builder.Build();
}
public IConfiguration Configuration { get; set; }
// This method gets called by the runtime.
// Use this method to add services to the container.
// For more information on how to configure your application,
// visit http://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services) {
services.AddMvc();
}
// This method gets called by the runtime.
// Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app) {
app.UseIISPlatformHandler();
app.UseDeveloperExceptionPage();
app.UseRuntimeInfoPage();
app.UseFileServer();
app.UseMvc(ConfigureRoute);
app.Run(async (context) => {
var msg = Configuration["message"];
await context.Response.WriteAsync(msg);
});
}
private void ConfigureRoute(IRouteBuilder routeBuilder) {
//Home/Index
routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}");
}
// Entry point for the application.
public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}
}
在ConfigureRoute 方法中,您可以配置您的路由; 您可以看到此方法必须采用 IRouteBuilder 类型的参数。 路由的目标是描述 ASP.NET Core MVC 将用来处理 HTTP 请求并找到可以响应该请求的控制器的规则。
您可以使用一个路由将请求映射到不同的控制器。
我们可以告诉 routeBuilder 我们要映射一个新的路由,它的名称是"Default",然后提供最重要的路由信息,即模板。
模板是一个字符串,它将向 ASP.NET Core MVC 描述如何拆分 URL。
在上一个示例中,我们添加了一个 HomeController,因此您还可以请求以下任何 URL,它们也将被定向到 HomeController 上的 Index 操作。
- http://localhost:49940
- http://localhost:49940/Home
- http://localhost:49940/Home/Index
当浏览器请求 http://mysite/ 或 http://mysite/Home 时,它会从 HomeController 的 Index 方法中取回输出。
您也可以通过更改浏览器中的 URL 来尝试此操作。 在这个例子中,它是 http://localhost:49940/, 除了端口可能不同。
如果您将 /Home 或 /Home/Index 附加到 URL 并按 Enter 按钮,您将看到相同的结果。
ID末尾的问号表示该参数是可选的。 换句话说,ASP.NET Core MVC 不必在此处看到某种 ID,它可能是数字、字符串或 GUID。
让我们在浏览器中运行应用程序。 应用程序运行后,您将看到以下输出。
您可以看到一条消息从 app.Run 中间件弹出,我们收到此消息的原因是 MVC 中间件看到了该 URL。 这是对网站根目录的请求,在 URL 中没有找到控制器名称或操作名称。网站的根放弃处理该请求并将请求传递给下一个中间件,即 app.Run 代码。 与默认模板不同,我们指定的路由模板是静态的。
在默认模板中,如果未找到控制器和操作名称,则有一些默认值可应用。如果请求进入网站的根目录,则默认控制器名称为 Home。 您可以根据需要将其更改为任何其他控制器,默认操作名称可以是 Index。 您也可以根据需要更改默认操作,如以下程序所示。
private void ConfigureRoute(IRouteBuilder routeBuilder) {
//Home/Index
routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}");
}
如果请求进入网站的根目录,MVC 看不到 URL 的控制器/操作类型,但它可以使用这些默认设置。
让我们保存 Startup.cs 文件并将浏览器刷新到网站的根目录。
您现在将看到来自您的控制器的响应,您还可以转到 /home,这将调用默认操作,即 index.html。 您还可以转到 /home/index,现在 MVC 将从 URL 中提取控制器名称和操作名称。
让我们通过添加另一个类来创建另一个控制器,并将其命名为AboutController。
让我们添加一些简单的操作方法,这些方法将返回字符串,如以下程序所示。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace FirstAppDemo.Controllers {
public class AboutController {
public string Phone() {
return "+49-333-3333333";
}
public string Country() {
return "Germany";
}
}
}
在这个控制器中,你可以看到两个动作方法 − Phone 和 Country,它们将分别返回电话号码和地区名称。 稍后我们将介绍 HTML。 让我们保存此文件并在根 URL 的末尾指定 /about/phone。
您可以在上面的屏幕截图中看到电话号码。 如果您指定 /about/country,您也会看到地区名称。
如果你转到/about,它会再次通过中间件跳转到你的应用程序。运行中间件,你会看到下面的页面。
在这里,ASP.NET Core MVC 转到 AboutController,但没有找到指定的操作。 所以它将默认为 Index 并且此控制器没有 Index 方法,然后请求将转到下一个中间件。

