.Net路由操作!!!!

news2024/11/18 1:34:38

什么是路由

问题

答案

路由是什么?

路由系统负责处理传入的请求并选择控制器和操作方法来处理它们。

路由系统还用于在视图中生成路由,称为传出的URL

路由有什么用?

 路由系统能够灵活地处理请求,面不是将URL与Visual Studio项目中的类结构关取到一起

如何使用路由?

URL与控制器和操作方法之间的映射定义在Statup.cs文件中,也可通过将 Route 性应用控制器来实现

有什么缺点或限制吗?

复杂应用程序的路由配置可能会变得难以管理

有其他代替方式吗?

没有,路由系统是ASP.NET Core的组成部分

URL模式

网址可以细分为片段。这些是 URL的组成部分,不包括由/字符分隔的主机名和查询字符串。

第一个片段包含单词Admin,第二个片段包含单词 Index

第一个片段与控制器有关,而第二个片段涉及操作。

以下是与示例URL匹配的网址格式:

                {controller}/{action}

创建和注册路由

在Startup文件的Configure方法中创建与注册路由

public class Startup

{

    public Startup(IConfiguration configuration)

    {

        Configuration = configuration;

    }

 

    public IConfiguration Configuration { get; }

 

    public void ConfigureServices(IServiceCollection services)

    {

        services.AddControllersWithViews();

    }

 

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    {

        if (env.IsDevelopment())

        {

            app.UseDeveloperExceptionPage();

        }

        else

        {

            app.UseExceptionHandler("/Home/Error");

            app.UseHsts();

        }

        app.UseHttpsRedirection();

        app.UseStaticFiles();

 

        app.UseRouting();

 

        app.UseAuthorization();

 

        app.UseEndpoints(endpoints =>

        {

            //基本路由

            //https://localhost:44352/Home/Index

            endpoints.MapControllerRoute(

                name: "default",

                pattern: "{controller}/{action}");

        });

    }

}

控制器

我们使用到的控制器有:

控制器

方法(有一个参数或无参数)

AdminController

Index

CustomerController

Index 和 List

HomeController

Index 和 CustomVariable

 

定义默认值路由

//定义默认值路由

//方法一

//基本路由

//https://localhost:44352/Home

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller}/{action}",

    defaults: new { action = "Index" });

 

 

//方法二

//https://localhost:44352/

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller=Home}/{action}",

    defaults: new { action = "Index" });

方法一中告诉我们可以在defaults属性中定义默认的路由

方法二告诉我们可以在定义路由模式时定义路由,并且可以混用defaults

 

静态URL片段

告诉我们并非所有片段必须是变量 https://localhost:44352/Public/Home/Index

//使用静态片段

endpoints.MapControllerRoute(

    name: "",

    pattern: "Public/{controller}/{action}");

隐藏控制器与Action路由

想象:我们原本使用Shop控制器的,后来被Home取代了,如何不改变路由的情况下修改路由设置?

解决方案: https://localhost:44352/Shop/Index

//更换控制器但不改变路由

//这里是Admin控制器取代了Shop控制器

endpoints.MapControllerRoute(

    name: "",

    pattern: "Shop/{action}",

    defaults: new { controller = "Admin" });

带参数的路由配置

带参数的路由,参数默认值是"DefaultId" https://localhost:44352/

//自定义URL参数变量

endpoints.MapControllerRoute(

    name: "MyRoute",

    pattern: "{controller=Home}/{action=Index}/{id=DefaultId}");

可选带参数的路由配置  https://localhost:44352/home/CustomVariable

//自定义URL可选参数变量

endpoints.MapControllerRoute(

    name: "MyRoute",

    pattern: "{controller=Home}/{action=Index}/{id?}");

定义可变长度路由:没什么用 https://localhost:44352/Customer/List/MyId/fda/2223d

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller=Home}/{action=Index}/{id?}/{*abc}");

控制器中使用路由参数的两种方法

方法一,使用参数形式

public IActionResult Index(string id)

{

    Result r = new Result

    {

        Controller = nameof(HomeController),

        Action = nameof(Index)

    };

    var id = id ?? "<没有值>";

    return View(id);

}

方法二,使用RouteData.Values

public IActionResult Index()

{

    var id = RouteData.Values["Id"];

    return View(id);

}

路由约束

查看有什么约束

命名空间:Microsoft.AspNetCore.Routing.Constraints

int 约束路由:只能是int值   https://localhost:44352/Home/Index/23

constraints:英文翻译(约束)

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller}/{action}/{id:int?}",

    defaults: new { controller = "Home", action = "Index"

    constraints: new { id = new IntRouteConstraint() });

int约束路由:只能是Int值。另一种形式

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller=Home}/{action=Index}/{id:int?}");

正则表达式约束路由

约束匹配H开头的控制器  https://localhost:44352/Home/Index/827

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller:regex(^H.*$)=Home}/{action=Index}/{id?}");

约束以H开头的控制器,并且Action方法是Index或者About  https://localhost:44352/Home/Index/827

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller:regex(^H.*$)=Home}/{action:regex(^Index$| ^About$)=Index}/{id?}");

范围约束

id参数可选,如果有值只能是在10到20之间(包括10和20)  https://localhost:44352/Home/Index/20

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller}/{action}/{id:range(10,20)}",

    defaults: new { controller = "Home", action = "Index" });

组合约束

id值可选,id存在值则必须全是字母并且字母长度不能低于6  https://localhost:44352/home/index/fasdfa

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller=Home}/{action=Index}/{id:alpha:minlength(6)?}");

另一种形式

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller}/{action}/{id?}",

    defaults: new { controller = "Home", action = "Index" },

    constraints: new

    {

        id = new CompositeRouteConstraint(

            new IRouteConstraint[]

            {

                new AlphaRouteConstraint(),

                new MinLengthRouteConstraint(6)

            })

    });

使用自定义路由约束

你可以在 .net 中使用自定义路由约束的情况有:

- 当你想要对路由参数进行更复杂或特定的验证时,例如匹配枚举值,正则表达式,或自定义逻辑。

- 当你想要扩展框架提供的内置路由约束时,例如 int, bool, datetime 等。

- 当你想要实现 IRouteConstraint 接口并重写 Match 方法时,该方法返回 true 或 false 来表示是否满足约束条件。

创建一个类WeekDayConstraint实现IRouteConstraint接口

public class WeekDayConstraint : IRouteConstraint

{

    private static string[] Days = new[] { "周一", "周二", "周三", "周四", "周五", "周六", "周日" };

    public bool Match(HttpContext httpContext, IRouter route, string routeKey,

            RouteValueDictionary values, RouteDirection routeDirection)

    {

        return Days.Contains(values[routeKey]?.ToString());

    }

}

在Startup文件的ConfigureServices方法注册服务

public void ConfigureServices(IServiceCollection services)

{

    services.AddControllersWithViews();

    services.Configure<RouteOptions>(options =>

    {

        options.ConstraintMap.Add("weekday", typeof(WeekDayConstraint));

    });

}

使用自定义路由约束  https://localhost:44352/Home/Index/周一

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller=Home}/{action=Index}/{id:weekday?}");

使用自定义路由约束,不注册服务

如果不想在Startup文件的ConfigureServices方法注册服务

endpoints.MapControllerRoute(

    name: "",

    pattern: "{controller}/{action}/{id?}",

    defaults: new { controller = "Home", action = "Index" },

    constraints: new

    {

        id = new WeekDayConstraint()

    });

特性路由

特性路由在控制器中操作

但也需要有一个路由,不然无法找到Action方法

endpoints.MapControllerRoute(

    name: "default",

    pattern: "{controller}/{action}");

控制器操作

方式一  只需输入字符串内容

https://localhost:44352/myroute

[Route("myroute")]

public IActionResult Index()

{

    return View();

}

方式二  使用时必须指定控制器名称

https://localhost:44352/Customer/MyAction

[Route("[controller]/MyAction")]

public IActionResult Index()

{

    return View();

}

方式三: 在类中使用特性 复杂路由 :

https://localhost:44352/app/Customer/actions/Index/周二

[Route("app/[controller]/actions/[action]/{id:weekday?}")]

public class CustomerController : Controller

{

public IActionResult Index()

{

    return View();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL(31)-ubuntu20.04-下安装mysql5.7

ubuntu20.04 下apt 默认安装的是8.0版本&#xff0c;如果要安装5.7版有如下3种方式&#xff1a; 1 下载 MySQL 二进制压缩包&#xff0c;解压并设置相关的参数即可运行 2 通过命令 apt install 进行安装&#xff0c;先下载 MySQL 5.7 对应的源&#xff0c;然后执行安装命令 ap…

5 分钟带你小程序入门 [实战总结分享]

微信小程序常常用 4 种文件类型 JS 文件 JS 在小程序中用于编写页面逻辑和交互效果&#xff0c;可调用 API 接口完成数据请求和处理&#xff0c;也可以使用第三方库和框架。 模块化编程&#xff1a;小程序中JS文件可以使用ES6的模块化语法&#xff0c;通过export和import来…

【vue3】关于watch与computed的用法看这个就ok

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;watch()与computed的使用【vue2中watch|computed概念详解】&#xff0c;本文将介绍在vue3中怎么使用这两者技能 【前言】vue2当中有这两个技能&#xff0c;那么vue3中的watch与compute…

【云原生进阶之容器】第六章容器网络6.4.1--Flannel组网方案综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述

【Unity】用HDRI作为Unity的Skybox

教程&#xff1a;用HDRI作为Unity的Skybox 在Unity中&#xff0c;Skybox是用于创建环境背景的一种组件。使用高动态范围图像&#xff08;HDRI&#xff09;作为Skybox可以提供更真实的环境背景。以下是使用HDRI作为Unity Skybox的步骤&#xff1a; 步骤1&#xff1a;下载HDRI图…

进销存管理系统能为企业带来哪些实际效益?

随着互联网的不断发展&#xff0c;如今的商业世界已经越来越向数字化转型。拥有一套完整的数字化的进销存管理能够极大地提升公司货物进出库存情况的效率和准确性&#xff0c;避免过程中出现不必要的错误和漏洞&#xff0c;从而帮助企业更加稳健地自我发展。那么&#xff0c;一…

华为MatePad有什么好用的软件?

现如今伴随着办公方式的转变&#xff0c;人们正迫切地寻找能够顺应时代的“生产力新工具”&#xff0c;它既要能够满足线上/线下灵活切换&#xff0c;又要具备绘画、键入、远程沟通、跨终端联动等多种功能。 对大多数人来说&#xff0c;日常使用华为平板只是满足一下娱乐和生活…

【SSA-LSTM】基于麻雀算法优化LSTM 模型预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

超详细从入门到精通,pytest自动化测试框架实战-fixture固件高级操作(十一)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 参数化fixture fix…

深度学习随笔

一、SPP的作用 解决了训练CNN需要输入图像尺寸一致的问题。 一个CNN可看作由卷积、池化、全连接层组成&#xff0c;由于全连接层的权重矩阵是一个固定值&#xff0c;因此输入全连接层的特征图的维度也必须固定。 SPP利用多尺度思想解决了上述问题&#xff0c;使得神经网络的训练…

2023/4/16总结

深刻的了解了网络编程的一些知识点 socket:套接字 ServerSocket 用来声明服务器 Socket用来声明客户端&#xff0c;其实也不然&#xff0c;在serversocket的accept的方法中&#xff0c;返回的是一个socket变量。我觉得更像一个接口&#xff0c;网络接口。 InternetAddress可以…

PaddlePaddle NLP学习笔记1 词向量

文章目录1.语言模型 Language Model1.1 语言模型是什么1.2 语言模型计算什么1.3 n-gram Language Model2.神经网络语言模型NNLM2.1 N-gram模型的问题3. 词向量3.1 词向量(word Embedding)word2vec 词向量训练算法3.2 如何把词转换为词向量&#xff1f;3.3如何让向量具有语义信息…

Windows 下部署Redis 主从模式+哨兵模式+JAVA连接方式

前言 之前项目需求部署redis高可用&#xff0c;走了很多弯路以及相关配置来回折腾浪费了很多时间&#xff0c;特地记录下。 主从模式&#xff1a;实现多台redis实例进行服务运行&#xff0c;并且数据相互同步&#xff1b; 哨兵模式&#xff1a;实现主服务器和从服务器进行监听…

工业电子中的安森美深力科AMIS30660CANH2RG CAN收发器 面向工业自动化和汽车电源应用

工业电子中的安森美深力科AMIS30660CANH2RG CAN收发器 面向工业自动化和汽车电源应用 AMIS30660CANH2RG CAN 收发器是控制器区域网络 (CAN) 协议控制器和物理总线之间的接口&#xff0c;可在 12 V 和 24 V 系统中使用。该收发器为总线提供差分发射功能&#xff0c;向 CAN 控制…

Spark编程基础-RDD

目录 1.何为RDD 2.RDD的五大特性 3.RDD常用算子 3.1.Transformation算子 1.map() 2.flatMap() 3.reduceByKey() 4 . mapValues() 5. groupBy() 6.filter() 7.distinct() 8.union() 9.join() 10.intersection() 11.glom() 12.gruopBykey() 13.sortBy() 14.sortByKey …

docker+docker-compose+nginx前后端分离项目部署

文章目录1.安装docker1.1 基于centos的安装1.2 基于ubuntu2.配置国内加速器2.1 配置阿里云加速器&#x1f340; 找到相应页面&#x1f340; 创建 docker 目录&#x1f340; 创建 daemon.json 文件&#x1f340; 重新加载服务配置文件&#x1f340; 重启 docker 引擎2.2 配置网易…

OJ系统刷题 第八篇

13415 - 津津的储蓄计划 时间限制 : 1 秒 内存限制 : 128 MB 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津…

计算机组成原理---第四章 指令系统

一、指令系统的发展与性能要求 指令系统的概述 指令就是要计算机执行某种操作的命令。可分为&#xff1a;①微指令&#xff0c;属于硬件&#xff1b;②机器指令&#xff0c;简称指令&#xff0c;完成算术逻辑操作&#xff1b;③宏指令&#xff0c;由若干条机器指令组成&#xf…

[Java]JSTL标签库

EL表达式https://blog.csdn.net/m0_71229255/article/details/130173486?spm1001.2014.3001.5501 JSTL标签的使用 Java Server Pages Standard Tag Libray(JSTL): JSP标准标签库&#xff0c;是一个定制标签类库的集合&#xff0c;用于解决一些常见的问题&#xff0c;例如迭代…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 建模方案及代码实现

更新信息&#xff1a;2023-4-15 更新了代码 【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 1 题目 电商物流网络由物流场地&#xff08;接货仓、分拣中心、营业部等&#xff09;和物流场 地之间的运输线路组成&#xff0c;如…