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 框架中,我们有三个组件,每个组件都专注于特定部分的工作。 为了使所有这些工作,我们需要找到一种方法将这些 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 请求并找到可响应该请求的控制器的规则
- 我们使用一条路由规则将请求映射到不同的控制器
- 我们告诉 routeBuilder 我们想要映射一个新的路由,它的名字是
Default
,然后提供最重要的路由信息,路由模板 - 路由模板是一个字符串,它用于向 ASP.NET Core MVC 描述如何拆分 URL
- 在前面的章节中,我们添加了一个
HomeController
,因此我们可以请求以下任何 URL,并且它们也将被定向到 HomeController 上的 Index 操作- https://localhost:5001
- https://localhost:5001/Home
- https://localhost:5001/Home/Index
- 当浏览器请求
http://mysite/
或http://mysite/ Home
时,它将得到 HomeController 的 Index 方法的输出的内容 - 我们可以通过更改浏览器中的 URL 来尝试此操作。在这个例子中,它是
https:// localhost:5001/
,可能端口号有所不同 - 如果我们将
/Home
或/Home/Index
追加到 URL 并按下 Enter 按钮,也会看到相同的结果 - 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 方法,然后这个请求会进入下一个中间件
ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程的更多相关文章
- Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳
http://cache.baiducontent.com/c?m=9d78d513d98316fa03acd2294d01d6165909c7256b96c4523f8a9c12d522195646 ...
- ASP.NET Core 属性路由 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 属性路由 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 属性路由 经过前面章节的学习,想必你已经对 ASP.NET Core ...
- ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...
- ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置 ...
- ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core MVC 设计模式 上一章节中,我们提到 ASP.NET Co ...
- ASP.NET Core 项目配置 ( Startup ) - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 项目配置 ( Startup ) - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 项目配置 ( Startup ) 前面几章节 ...
- 从头编写asp.net core 2.0 web api 基础框架 (5) + 使用Identity Server 4建立Authorization Server (7) 可运行前后台源码
前台使用angular 5, 后台是asp.net core 2.0 web api + identity server 4. 从头编写asp.net core 2.0 web api 基础框架: 第 ...
- ASP .Net Core路由(Route) - 纸壳CMS的关键
关于纸壳CMS 纸壳CMS是一个开源免费的,可视化设计,在线编辑的内容管理系统.基于ASP .Net Core开发,插件式设计: GitHub:https://github.com/SeriaWei/ ...
- 构建可读性更高的 ASP.NET Core 路由
原文:构建可读性更高的 ASP.NET Core 路由 一.前言 不知你在平时上网时有没有注意到,绝大多数网站的 URL 地址都是小写的英文字母,而我们使用 .NET/.NET Core MVC 开发 ...
随机推荐
- 23、V4L2应用编写及各个ioctl涉及结构体说明分析
常用的结构体在内核目录include/linux/videodev2.h中定义 struct v4l2_requestbuffers //申请帧缓冲,对应命令VIDIOC_REQBUFSstruct ...
- mysql select 无order by 默认排序 出现乱序的问题
原文:mysql select 无order by 默认排序 出现乱序的问题 版权声明:感谢您的阅读,转载请联系博主QQ3410146603. https://blog.csdn.net/newMan ...
- jQuery获取多种input值的方法(转)
获取input的checked值是否为true: 第一种: if($("input[name=item][value='val']").attr('checked')==true) ...
- mysql触发器语法的一个实例
我要实现的功能是:在更新一个表时.从三个表中查询记录并插入到另外一个表中.以下是我写触发器的过程: 第一次写的触发器例如以下: CREATE TRIGGER istmingxi AFTER UPDA ...
- 【52.49%】【codeforces 556A】Case of the Zeros and Ones
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【PHP】php 递归、效率和分析(转)
递归的定义 递归(http:/en.wikipedia.org/wiki/Recursive)是一种函数调用自身(直接或间接)的一种机制,这种强大的思想可以把某些复杂的概念变得极为简单.在计算机科学之 ...
- try~Catch语句中异常的处理过程
[2014/10/12 21:40]文章待续~ 1.函数自身捕获处理异常的情况 以下的样例介绍了try~catch语句中出现异常时语句的运行顺序: package month10; import ja ...
- [Angular] Angular CLI
Create an app with routing config: ng new mynewapp --routing If you want to generate a new module wi ...
- php如何实现把多平台文件中所有的行合成一行?
php如何实现把多平台文件中所有的行合成一行? 一.总结 1.str_replace中的数组替换:str_replace(array("/r","/n",&qu ...
- Opencv Surf算子中keyPoints,描述子Mat矩阵,配对向量DMatch里都包含了哪些好玩的东东?
Surf算法是一把牛刀,我们可以很轻易的从网上或各种Opencv教程里找到Surf的用例,把例程中的代码或贴或敲过来,满心期待的按下F5,当屏幕终于被满屏花花绿绿的小圆点或者N多道连接线条霸占时,内心 ...