0. 前言

在之前我们介绍了请求通过路由寻找到控制器,以及控制器与视图的数据流转。那么,我们回过头来,再看看路由的一些其他用法。

1. 路由属性(Route Attribute)

按照英文的直接翻译,Routing Attribute 的意思是路由属性,但实际上 Attribute在微软的官方称呼是特性。嗯,所以个人觉得Route Attribute应该是特性路由,路由特性。

嗯,暂且甩开称呼的问题,小伙伴们知道这是一种使用Attribute标记的路由配置方案就行。我们之前了解的路由设置都是通过路由表设置的,而Route Attribute则是另外一种方案。

1.1 如何设置

这种方案主要是通过RouteAttribute类来设置的,我们先来看一下这个类是个什么样的吧:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class RouteAttribute : Attribute, IRouteTemplateProvider
{
public RouteAttribute(string template);
public string Name { get; set; }
public int Order { get; set; }
public string Template { get; }
}

AttributeUsage 这个特性是用来标注特性的适用范围的,其中AttributeTargets.Class | AttributeTargets.Method 表示这个特性是可以设置在类或者方法上的。AllMultiple表示是否允许设置多个,Inherited 表示被该特性标注的类其子类是否也自动继承了这个特性。

那么,我们了解了RouteAttribute的适用范围,继续看这个类,一共有三个属性:

  • Name 表示这个路由特性的名称
  • Order 表示启用顺序,值越小,越先被匹配。默认情况下是0
  • Template 路由解析模板,也就是在《【asp.net core 系列】2 控制器与路由的恩怨情仇》中介绍的路由表的格式串

介绍了这么多,我们先来试试看,先拿出来之前文章创建的MvcWeb项目,新建一个控制器:

using Microsoft.AspNetCore.Mvc;

namespace MvcWeb.Controllers
{
public class RouteTestController: Controller
{
public IActionResult Index()
{
return View();
}
}
}

创建对应视图:

Views > RouteTest > Index.cshtml

在Index.cshtml中随便写点内容,然后保存。

然后,在RouteTestController 添加一个Route特性标记:

[Route("/Route")]
public IActionResult Index()
{
return View();
}

启动项目,访问 http://localhost:5006/Route 后,如果不出意外可以看到跟下图类似的界面:

那么我们试一试通过路由表设置的路径是否可以访问:

http://localhost:5006/RouteTest

可以看到提示404,也就是说这个Action无法通过路由表的形式查找到了。

1.2 设置参数

我们知道所谓的Action其实也是一个方法,而我们通常请求一个网址的时候,网址中也带有一些查询参数。所以,这一节我们就介绍一下路由特性(属性路由)如何设置参数的解析吧。

1.2.1 不做任何操作

在RouteTestController里添加方法:

[Route("/route/norest")]
public IActionResult NoRest(string name)
{
ViewBag.Name = name;
return View();
}

创建对应的View:

<h1>@ViewBag.Name</h1>

启动程序,并访问:http://localhost:5006/route/norest

添加 ?name=test 在上一个请求的后面:

尝试变更name的值,可以发现网页中的值也发生了变化,证明我们可以获取到这个值。

1.2.2 当做请求目录的一部分

在上一小节中,没有对参数做任何操作,以查询参数的形式传递。在这一篇,我们可以把参数设置为请求的一部分,像目录那样,修改上一节示例代码为:

[Route("/route/norest/{name}/")]
public IActionResult NoRest(string name)
{
ViewBag.Name = name;
return View();
}

请求方式:

http://localhost:5006/route/norest/1232

修改连接中的1232 内容,然后刷新页面,就能发现页面中的值也发生了变化

1.2.3 给参数一个默认值

之前的设置里我们都默认参数由请求URL获取,那么在这里我们介绍一下给参数一个值:

[Route("/route/norest/{name=demo}/")]
public IActionResult NoRest(string name)
{
ViewBag.Name = name;
return View();
}

访问连接:

http://localhost:5006/route/norest/

可以看见:

设置为可空,也就是参数可以不传:

[Route("/route/norest/{name?}/")]
public IActionResult NoRest(string name)
{
ViewBag.Name = name;
return View();
}

访问连接:

http://localhost:5006/route/norest/

可以看到页面没有任何显示:

正常情况下,如果不对参数设置可空而且参数被我们当做目录的一部分时,不给值是会提示404。

1.3 路由约束

约束 示例 匹配项示例 说明
int {id:int} 123456789, -123456789 匹配任何整数
bool {active:bool} true, FALSE 匹配 truefalse。 不区分大小写
datetime {dob:datetime} 2016-12-31, 2016-12-31 7:32pm 在固定区域性中匹配有效的 DateTime 值。 请参阅前面的警告。
decimal {price:decimal} 49.99, -1,000.01 在固定区域性中匹配有效的 decimal 值。 请参阅前面的警告。
double {weight:double} 1.234, -1,001.01e8 在固定区域性中匹配有效的 double 值。 请参阅前面的警告。
float {weight:float} 1.234, -1,001.01e8 在固定区域性中匹配有效的 float 值。 请参阅前面的警告。
guid {id:guid} CD2C1638-1638-72D5-1638-DEADBEEF1638 匹配有效的 Guid
long {ticks:long} 123456789, -123456789 匹配有效的 long
minlength(value) {username:minlength(4)} Rick 字符串必须至少为 4 个字符
maxlength(value) {filename:maxlength(8)} MyFile 字符串不得超过 8 个字符
length(length) {filename:length(12)} somefile.txt 字符串必须正好为 12 个字符
length(min,max) {filename:length(8,16)} somefile.txt 字符串必须至少为 8 个字符,且不得超过 16 个字符
min(value) {age:min(18)} 19 整数值必须至少为 18
max(value) {age:max(120)} 91 整数值不得超过 120
range(min,max) {age:range(18,120)} 91 整数值必须至少为 18,且不得超过 120
alpha {name:alpha} Rick 字符串必须由一个或多个字母字符(a-z,不区分大小写)组成。
regex(expression) {ssn:regex(^\\d{{3}}-\\d{{2}}-\\d{{4}}$)} 123-45-6789 字符串必须与正则表达式匹配。 请参阅有关定义正则表达式的提示。
required {name:required} Rick 用于强制在 URL 生成过程中存在非参数值

2. 路由统一前缀

在第一节中,我们介绍了如何使用RouteAttribute为控制器里的方法标记路由信息。有时候会出现这样的一个问题,一个控制器方法里可能会出现多个方法(Action)。通常情况下,我们要求一个控制器处理的请求应当有一个统一的前缀(或者称之为URL目录)。

那么,这种情况我们仍然继续使用 RouteAttribute,不过与之前不同的是,这次直接在控制器类上标记:

[Route("/Route")]
public class RouteCtrTestController: Controller
{
}

这时候,在方法上如果添加了RouteAttribute,设置的路由信息如果不是以/ 开始,则会将该Action的路由配置加到Controller后面。如果是以/ 开始,则表示该路由是根路由。

如果没有设置RouteAttribute,则表示当前方法是处理控制器配置的路由的方法。

如果一个控制器里出现多个未设置RouteAttribute,则会出错。

示例代码如下:

[Route("/Route")]
public class RouteCtrTestController: Controller
{
public int temp{get;set;}
public IActionResult Index(int temp)
{
return Content($"你好{temp}");
}
[Route("Demo")]
public IActionResult Demo()
{
return Content($"你好 Demo");
}
}

2. 总结

今天的内容比较短,这里介绍了一些路由的另一种用法,小伙伴们对此有个了解就可以了。下一篇将会到视图,开始准备带领大家做一个小项目啦。

更多内容烦请关注我的博客《高先生小屋》

【asp.net core 系列】4. 更高更强的路由的更多相关文章

  1. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  2. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  3. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  4. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  5. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  6. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  7. 【asp.net core 系列】 1 带你了解一下asp.net core

    0. 前言 这是一个新的系列,名字是<ASP.NET Core 入门到实战>.这个系列主讲ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我们需要的即可,并非主讲).同 ...

  8. 【asp.net core 系列】6 实战之 一个项目的完整结构

    0. 前言 在<asp.net core 系列>之前的几篇文章中,我们简单了解了路由.控制器以及视图的关系以及静态资源的引入,让我们对于asp.net core mvc项目有了基本的认识. ...

  9. 【asp.net core 系列】10 实战之ActionFilter

    0.前言 在上一篇中,我们提到了如何创建一个UnitOfWork并通过ActionFilter设置启用.这一篇我们将简单介绍一下ActionFilter以及如何利用ActionFilter,顺便补齐一 ...

随机推荐

  1. 05JAVA基础方法

    一.格式 函数有返回值 public static 返回类型 方法名(参数类型 形参1,参数类型 形参2){ 函数体; return 返回值;//返回值必须是定义的返回类型 } 函数没有有返回值 pu ...

  2. jar包名修改工具

    jar包名修改工具 软件传送门:链接: https://pan.baidu.com/s/12StRdEkYGmMn1DuNSquXSw   提取码: i9w1 闲暇之余,利用jarjar.jar写了一 ...

  3. Java并发II

    Java并发 J.U.C图 一.线程的安全性 当多个线程访问某个类的时候,不管运行环境采用何种方式调度或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都可以表现出正确的行 ...

  4. 死磕synchronized底层实现

    点赞再看,养成习惯,微信搜索[三太子敖丙]第一时间阅读. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. 前言 ...

  5. 你了解C#的协变和逆变吗

    从C# 4.0开始,泛型接口和泛型委托都支持协变和逆变,由于历史原因,数组也支持协变. 里氏替换原则:任何基类可以出现的地方,子类一定可以出现. 协变(out) 协变:即自然的变化,遵循里氏替换原则, ...

  6. day02:三元运算、布林非、列表等(20170214)

    #1:三元运算(满足条件就返回值,不简洁的代码):a= 1b= 3c= 5if a > b : d = aelse: d = cprint (d) #2:三元运算(满足条件就返回值,简洁的代码) ...

  7. js倒计时 手机休眠时 时间不进行减少

    http://www.111cn.net/wy/js-ajax/94218.htm 手机版网页js倒计时存在的问题与解决的方法 www.111cn.net 更新:2015-09-16 编辑:kp123 ...

  8. UVALive 3295

    题目大意:见刘汝佳<算法竞赛入门经典——训练指南>P173 解题思路: 每一个合法的三角形的三个顶点都不在同一直线上,那么问题其实就是在求所有不全在同一直线上的三点的组合数. 我们可以利用 ...

  9. 五、数据类型(1):整数&&带小数点的数

    1.整数 int printf("%d",...); scanf("%d",&...); 2.带小数点的数 double printf("%f ...

  10. JS中的var、let、const三者的区别

    ES5:var          ES6:let.const ES5中的作用域有---全局作用域.函数作用域 ES6中新增了---块级作用域(块级作用域由{}包裹,if语句.for语句中的{}也属于块 ...