iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NET Core中MVC模式实现路由一
  • 793
分享到

ASP.NET Core中MVC模式实现路由一

2024-04-02 19:04:59 793人浏览 薄情痞子
摘要

目录1.前言2.设置路由中间件3.传统路由4.多个路由4.1定义多个路由4.2区分操作5.属性路由5.1 属性路由5.2 使用 Http[Verb] 属性的属性路由5.3合并路由5.

相关文章

ASP.net coremvc模式实现路由一

ASP.net core中MVC模式实现路由二

1.前言

ASP.Net Core MVC使用路由中间件来匹配传入请求的URL并将它们映射到操作(Action方法)。路由在启动代码(Startup.Configure方法)或属性(Controller Action属性)中定义。路由描述应如何将URL路径与操作(Action方法)相匹配。它还用于在响应中生成送出的URL。
路由操作可以设置中间件,支持传统路由、属性理由(通过在Controller Action上放置理由可实现)、多个路由。

2.设置路由中间件

在Configure方法中,可能会看到与下面类似的设置路由中间件代码:

app.UseMvc(routes =>
{
    routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});

等价于

//默认模版就是 "{controller=Home}/{action=Index}/{id?}"
app.UseMvcWithDefaultRoute();

在UseMvc的匿名方法中,MapRoute表示创建单个路由,指定为默认(default)路由、路由模版“{controller=Home}/{action=Index}/{id?}”。
路由模版“{controller=Home}/{action=Index}/{id?}”的意思是可以匹配“/Home/Index/5”的URL路径。也就是说:

  • {controller=Home}将Home定义为默认controller。
  • {action=Index}将Index定义为默认action。
  • {id?}将id定义为可选参数。

UseMvc和UseMvcWithDefaultRoute可向中间件管道添加RouterMiddleware的实例。MVC不直接与中间件交互,而是使用路由来处理请求。MVC通过MvcRouteHandler实例连接到路由。 重载UseMvc(Action<IRouteBuilder>) 则允许用户添加自己的路由,并且还支持属性路由。UseMvcWithDefaultRoute定义默认路由并支持属性路由。

3.传统路由

默认路由:
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
上述代码就是一个传统路由,将这种方式称为传统路由的原因在于,它为URL路径设立了一个约定:

  • 第一个路径段映射到控制器名称
  • 第二段映射到操作名称。
  • 第三段用于可选id(用于映射到模型实体)。

使用此default路由时,URL路径/Home/Index映射到HomeController.Index。此映射仅基于控制器和操作(action)名称,而不基于命名空间、源文件位置或方法参数。

4.多个路由

4.1定义多个路由

通过对UseMvc匿名方法添加多个路由,这样做可以定义多个约定或添加专用于特定操作的传统路由,比如:

app.UseMvc(routes =>
{
    //第一个路由
    routes.MapRoute("blog", "blog/{*article}",defaults: new { controller = "Blog", action = "Article" });
    //第二个路由
    routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

第一个路由里{*article}是表示使用catch-all路由参数来捕获URL路径的剩余部分。下面我们通过测试来验证下:

●"blog/{*article}":

●"blog/{article}":

通过上述测试可以知道,加星号的路由在传参字符串中加了斜杠依然能够打开,没加星号的路由在传参字符串中加了斜杠就不能打开了。还有一点要注意的是controller.action接收参数必须跟*后面参数名称一致,不然会接收不到参数值。

4.2区分操作

当controller存在两个action名称一致的方法,MVC必须要进行区分,不然会引发异常,例如:

public class BloGController : Controller
{
    public IActionResult Edit(int id) {}
    [HttpPost]
    public IActionResult Edit(int id, Blog blog) {}
}

当请求为HTTP POST时MVC会选择Edit(int, Blog),在Http属性为任何其他内容时选择 Edit(int)。如果匹配多个路由,而MVC找不到“最佳”路由Action时,则会引发 AmbiguousActionException异常。

5.属性路由

5.1 属性路由

属性路由使用一组属性将操作(Action)直接映射到路由模板。 在下面的示例中,Configure 方法使用app.UseMvc(),不传递任何路由。HomeController将匹配一组URL,这组URL与默认路由{controller=Home}/{action=Index}/{id?}匹配的URL类似:

public class HomeController : Controller
{
   [Route("")]
   [Route("Home")]
   [Route("Home/Index")]
   public IActionResult Index()
   {
      return View();
   }
}

下面我们通过表格来看看每个属性路由在浏览器上打开链接是怎样的效果。

Route Template

Browser

Page

Route("")

[SERVICE_NAME]

[SERVICE_NAME]/Home/Index

Route("Home")

[SERVICE_NAME]/Home

Route("Home/Index")

[SERVICE_NAME]/Home/Index

 三种属性路由在浏览器上打开链接方式都不一样,但是呈现页面是一样的,也就是说三个属性路由的定义方式都是指向同一个/Home/Index页面。到这里或许大伙会有疑问,如果我把三个属性路由模版名称都改变下,那会能打开同一个页面么?

[Route("1")]
[Route("Home1")]
[Route("Home1/Index1")]

上述模版名称更改了,但是在浏览器呈现页面还是指向/Home/Index的,也就是说,无论属性路由模版名称如何更改总能打开对应/Home/Index页面。

5.2 使用 Http[Verb] 属性的属性路由

属性路由还可以使用Http[Verb]属性,比如HttpPostAttribute。所有这些属性都可采用路由模板。此示例展示与同一路由模板匹配的两项操作:

public class BlogController : Controller
{
    [HttpGet("/article/{id}", Name = "Article_List")]
    public IActionResult Article(string id)
    {
        return View();
    }
}

当我们在浏览器上输入[SERVICE_NAME]/article/1时候,通过DEBUG我们可以看到响应结果:

通过响应结果可以知道属性路由首先将URL与路由属性定义的路由模板集([HttpGet("/article/{id}", Name = "Article_List")])进行匹配。一旦某个路由模板匹配,就会应用IActionConstraint约束来确定可以执行的操作。

5.3合并路由

根据业务场景如果我们需要将某个Controller重新命名为以便访问该Controller下面所有action,那么该如何设置呢?下面通过示例来演示下:

[Route("homes")]
public class HomeController : Controller
{
    [HttpGet("{id}")]
    public IActionResult Index()
    {
       return View();
    }
}

根据上述代码,在HomeController上放置路由属性([Route("homes")])会使控制器中的所有操作(Action)都使用该属性路由。也就是说只有URL HTTPGet :[SERVICE_NAME]/homes/1才能访问Index视图。这种做法好处是,HomeController下的每个Action操作不用单独添加Route("homes")属性,只需要在HomeController外放置一个全局Route("homes")属性即可应用到每个Action去,减少路由属性重复。

5.4指定属性路由的可选参数、默认值和约束

属性路由同时也支持使用与传统路由相同的内联语法,来指定可选参数、默认值和约束。下面请看示例:

public class HomeController : Controller
{
    [HttpGet("homes/{id:int}")]
    public IActionResult Index(int id)
    {
        return View();
    }
}

上述代码执行结果我们通过表格来看看效果:

Browser

Result status

[SERVICE_NAME]/homes/1

200

[SERVICE_NAME]/homes/qwe

404

[HttpGet("homes/{id:int}")]把传入id参数值约束为只有数字才能打开该属性下视图,如果传入是字符串则无法找到该视图。而更多路由约束模板在这里参阅。

5.4自定义属性路由

我们可以通过框架自带的IRouteTemplateProvider接口自定义路由属性(例如类似[HttpGet]、[Route("homes")]等属性)。当应用程序启动时,MVC会查找控制器类和操作方法上的属性,并使用实现IRouteTemplateProvider的属性生成一组初始路由。此部分通过一个简单的示例说明了如何使用应用程序自定义属性路由:

public class MyControllerAttribute : Attribute, IRouteTemplateProvider
{
    //实现接口的三个属性,这里的[controller]是一个标记替换。
    public string Template => "api/[controller]/{action}/{id?}";
    public int? Order { get; set; }
    public string Name { get; set; }
}

新建一个路由属性类自定义属性路径,然后在Controller或者Action上放置自定义属性路由。

public class BlogController : Controller
{
    [MyController()]
    public IActionResult Article(string id)
    {
        return View();
    }
}

通过执行[SERVICE_NAME]/api/Blog/Article/1链接时访问成功,也就是说自定义属性路由成功。

到此这篇关于asp.net Core中MVC模式实现路由的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: ASP.NET Core中MVC模式实现路由一

本文链接: https://www.lsjlt.com/news/145164.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NET Core中MVC模式实现路由一
    目录1.前言2.设置路由中间件3.传统路由4.多个路由4.1定义多个路由4.2区分操作5.属性路由5.1 属性路由5.2 使用 Http[Verb] 属性的属性路由5.3合并路由5....
    99+
    2024-04-02
  • ASP.NET Core中MVC模式实现路由二
    目录1.URL生成2.URL生成方式2.1根据操作名称生成URL2.2根据路由生成URL2.3在HTML中生成URL2.4在操作结果中生成URL3.区域(Area)4.实现IActi...
    99+
    2024-04-02
  • ASP.NET Core中MVC模式怎么实现路由
    这篇“ASP.NET Core中MVC模式怎么实现路由”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ASP.NET...
    99+
    2023-06-29
  • ASP.NET Core MVC路由怎么用
    本篇内容介绍了“ASP.NET Core MVC路由怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! AS...
    99+
    2023-06-30
  • ASP.NET Core MVC路由(Routing)的用法
    目录1.设置路由中间件2.常规路由3.多路由1.回退2.行动歧义3.路由名称4.路由特性5.组合路由6.特性路由的顺序7.路由模板中的标记替换( [controller] , [ac...
    99+
    2024-04-02
  • ASP.NET MVC实现区域路由
    目录一、区域路由二、示例程序1、新建区域路由2、注册区域路由2.1、区域路由文件2.2、全局注册区域路由三、测试区域路由一、区域路由 为了管理网站中大量的文件,在ASP.NET MV...
    99+
    2024-04-02
  • ASP.NET MVC实现路由功能
    1、定义路由、路由规则 public static void RegisterRoutes(RouteCollection routes) { ...
    99+
    2022-11-13
    ASP.NET MVC 路由功能
  • ASP.NET Core MVC中的模型(Model)
    目录1.模型绑定2.使用模型绑定3.通过特性自定义模型绑定行为4.从请求主体绑定格式化的数据5.模型验证6.自定义验证7.客户端验证8.远程验证1.模型绑定 ASP.NET Core...
    99+
    2024-04-02
  • ASP.NET Core MVC中怎么实现过滤器
    本篇内容介绍了“ASP.NET Core MVC中怎么实现过滤器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!过滤器如何...
    99+
    2023-06-29
  • ASP.NET Core MVC中的模型怎么使用
    本篇内容介绍了“ASP.NET Core MVC中的模型怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.模型绑...
    99+
    2023-06-30
  • ASP.NET MVC中的路由原理与用法
    目录一、概述二、路由原理1、注册路由2、路由匹配2.1、匹配方式一2.2、匹配方式二2.3、匹配方式三3、URL参数默认值3.1、参数默认值一3.2、参数默认值二3.4、参数默认值三...
    99+
    2024-04-02
  • ASP.NET Core中怎么给路由规则命名
    今天就跟大家聊聊有关ASP.NET Core中怎么给路由规则命名,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。比如,放到 /Views 下。Views(目录)  ...
    99+
    2023-06-19
  • asp.net core MVC之实现基于token的认证
    安装Nuget包 项目中添加包:dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer 添加认证配置 S...
    99+
    2024-04-02
  • ASP.NET Core自动生成小写破折号路由的实现方法
    目录1、如何生成小写的路由可以这样设置2、生成带破折号并且小写的路由可以这样设置3、解决方案3.1对于Asp.NetCore2.2MVC:3.2  对于Asp.N...
    99+
    2024-04-02
  • 实现ASP.NET Core自动生成小写破折号路由的方法
    这篇文章主要讲解了“实现ASP.NET Core自动生成小写破折号路由的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“实现ASP.NET Core自动生成小写破折号路由的方法”吧!默认情...
    99+
    2023-06-14
  • ASP.NET Core MVC 修改视图的默认路径及其实现原理解析
    本章将和大家分享如何在ASP.NET Core MVC中修改视图的默认路径,以及它的实现原理。 导语:在日常工作过程中你可能会遇到这样的一种需求,就是在访问同一个页面时PC端和移动端...
    99+
    2024-04-02
  • vue路由的两种模式怎么实现
    这篇文章主要介绍“vue路由的两种模式怎么实现”,在日常操作中,相信很多人在vue路由的两种模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue路由的两种模式怎么...
    99+
    2024-04-02
  • ASP.NET Core中如何使用功能开关控制路由访问
    本篇内容介绍了“ASP.NET Core中如何使用功能开关控制路由访问”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!其实我们使用了...
    99+
    2023-06-29
  • ASP.NET MVC模式中应用程序结构详解
    目录一、App_Data二、App_Start三、Content四、Controllers五、font六、Models七、Scripts八、Views九、Web.config1、根目...
    99+
    2024-04-02
  • vue中路由的两种模式以及实现原理
    Vue.js 是一种流行的前端框架,通过其优秀的路由管理模块实现了单页应用(Single-page Application,SPA)的开发。Vue 路由管理模块(Vue Router)具有两种模式:历史模式(History mode)和哈希...
    99+
    2023-05-23
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作