ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程

简介: 原文:ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 路由 前两章节中,我们提到 ASP.NET Core 支持 MVC 开发模式,同时也给大家详细解释了 MVC 设计模式和 ASP.NET Core 中的 MVC 设计模式 MVC 框架中,我们有三个组件,每个组件都专注于特定部分的工作。

原文:ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET Core 路由

前两章节中,我们提到 ASP.NET Core 支持 MVC 开发模式,同时也给大家详细解释了 MVC 设计模式和 ASP.NET Core 中的 MVC 设计模式

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 ) ,它是一个 C# 类,不需要从基类派生或实现接口或具有任何特殊属性。 它是一个纯 C#类,名称为 HomeController,它包含返回字符串的 Index() 方法

using System;
namespace HelloWorld.Controllers
{ public class HomeController { public HomeController() { } public string Index() { return "你好,世界! 此消息来自 HomeController..."; } } } 

这里,我们回到路由上来,我们将重点关注路由到控制器,我们也将尝试理解路由如何工作

现在,我们回到 Startup 类,将 MVC 中间件配置到我们的应用程序中。然后在 Configure方法中,使用方法 UseMvcWithDefaultRoute()

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseFileServer(); app.UseMvcWithDefaultRoute(); } 

app.UseMvcWithDefaultRoute() 给了我们一个默认的路由规则,允许我们访问 HomeController

路由规则

当然了,接下来我们不使用 app.UseMvcWithDefaultRoute() ,而是使用 UseMvc(),然后在私有方法 ConfigureRoute() 处配置路由

以下是按照这种思路的 Startup.cs 的完整代码

using System;
using System.IO; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; namespace HelloWorld { public class Startup { public Startup() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .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 https://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, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } 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}/{action}/{id?}"); } } } 

ConfigureRoute() 方法中,我们可以配置路由,也许你已经注意到了,该方法必须使用 IRouteBuilder 类型的参数

路由的目标是描述 ASP.NET Core MVC 用于处理 HTTP 请求并找到可响应该请求的控制器的规则

  1. 我们使用一条路由规则将请求映射到不同的控制器
  2. 我们告诉 routeBuilder 我们想要映射一个新的路由,它的名字是 Default,然后提供最重要的路由信息​​,路由模板
  3. 路由模板是一个字符串,它用于向 ASP.NET Core MVC 描述如何拆分 URL
  4. 在前面的章节中,我们添加了一个 HomeController,因此我们可以请求以下任何 URL,并且它们也将被定向到 HomeController 上的 Index 操作
    1. https://localhost:5001
    2. https://localhost:5001/Home
    3. https://localhost:5001/Home/Index
  5. 当浏览器请求 http://mysite/http://mysite/ Home 时,它将得到 HomeController 的 Index 方法的输出的内容
  6. 我们可以通过更改浏览器中的 URL 来尝试此操作。在这个例子中,它是 https:// localhost:5001/ ,可能端口号有所不同
  7. 如果我们将 /Home/Home/Index 追加到 URL 并按下 Enter 按钮,也会看到相同的结果
  8. id 末尾的问号表示该参数是可选的。换句话说,ASP.NET Core MVC 在这里不需要看到某种类型的 id,可能是一个数字,也可能是一个字符串或 GUID

现在,我们重启应用程序,然后刷新浏览器,我们将获得以下输出

我们只看到了从 app.Run() 中间件输出的消息,得到此消息的原因是虽然 MVC 中间件看到了该 URL。 但这是对网站根目录的请求,网址中没有找到控制器名称或操作名称。

于是 Mvc 中间件放弃了处理该请求并将请求传递给下一个中间件,也就是 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。我们也可以跳转到 /home/index ,MVC 会将控制器名称和操作名称从 URL 中提取出来

添加一个控制器 AboutController

现在,我们添加另一个控制器并将其命名为 AboutController

目录结构如下

内容如下

我们添加一些简单的动作,返回字符串,完整代码如下

using System;
namespace HelloWorld.Controllers
{ public class AboutController { public AboutController() { } public string Phone() { return "+10086"; } public string Country() { return "中国"; } } } 

在这个控制器中,我们可以看到两种操作方法:Phone()Country()。 我们稍后会添加一些花哨的 HTML。 但现在,我们先保存文件,然后访问 /about/phone,显示如下

我们可以看到输出了电话号码 +10086,如果我们访问 /about/country,则显示如下

可以看到输出了 中国,但如果我们访问 /about,那么它将再次通过中间件 app.Run(),我们将看到以下页面

看到这个页面,是因为 ASP.NET Core MVC 转到 AboutController,但没有找到指定的操作。所以它默认使用 Index,并且这个控制器没有 Index 方法,然后这个请求会进入下一个中间件

目录
相关文章
|
16天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
3月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
71 0
|
3月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
37 0
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
63 0
|
2月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
33 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
|
2月前
|
算法 BI API
C#/.NET/.NET Core优秀项目和框架2024年1月简报
C#/.NET/.NET Core优秀项目和框架2024年1月简报
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
41 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
99 5
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
116 0

相关实验场景

更多