构建可读性更高的 ASP.NET Core 路由

一、前言

  不知你在平时上网时有没有注意到,绝大多数网站的 URL 地址都是小写的英文字母,而我们使用 .NET/.NET Core MVC 开发的项目,因为在 C# 中类和方法名采用的是 Pascal 命名规范,根据 .NET 框架默认的路由规则,项目的 URL 地址会呈现出大小写混合的情况。对于强迫症来说,这种情况绝对不能忍,当然,由于整个项目的 URL 地址大小写混合显示,也无法更清晰的向用户、浏览器表达出当前页面的功能。那么,这篇文章就来介绍下,如何调整我们的 ASP.NET Core 项目的路由规则,从而使我们项目的 URL 地址可读性更高。

  PS:在构建 URL 的过程中,采用大写的地址还是采用小写的地址,每个人都会有自己的想法和这样做的理由,这篇文章不讨论两种方案的优劣,只是提供一种构建小写 URL 地址以及让我们的 URL 可读性更高的解决方案,请友善观看,切勿互怼。

  代码仓储:https://github.com/Lanesra712/grapefruit-common

 

二、Step by Step

  在构建项目的路由时,不管是采用大写的 URL 路由,还是采用小写的 URL 路由,我们首先需要确保的是,我们需要将整个项目的 URL 格式进行统一。不能说一个项目一部分的 URL 地址用大写的,而另一部分采用的是小写的 URL 地址。同时,同一个页面的大写的路径以及小写的路径,虽然最终服务器可能都会将两个地址指向同一个页面,但是对于搜索引擎的收录来说,这无疑是两个页面。

  试想以下,当别人告诉了我们一个有趣的网站,我们从浏览器的地址栏中输入网址进行访问。当我们输入 URL 地址时,不管是中文输入法还是英文输入法,输出的英文字母都是小写的,此时,如果输入的网址中存在大写字母,嗯,我们还需要使用 CapsLock 键进行大小写切换。

  另外,我们知道,对于 Windows 服务器来说,因为对于路径的大小写不敏感,如果我们弄错了地址的大小写,我们还是可以进行正常的访问的,可是,如果将应用部署到 Linux 服务器上的话。。。。

640?wx_fmt=jpeg

  至于更好的可读性,这个概念可能会显得有些主观。简单来说,就是当我们面对一个网址时,我们可以很清楚的通过这个网址知道这个网页的主要内容。例如,当我们看见www.youdomain.com/editor/post/new 这个网址时,虽然可能并没有打开这个网页,但我们还是可以大致猜到这个页面可能是新增文章的。可是,如果你收到的网址是 www.youdomain.com/9rg7f2/i?HXI-D+iaj34 这样的,没人能知道这个页面到底是干啥的。

640?wx_fmt=jpeg

  因此,为了便捷输入,首先我们需要将我们的 URL 地址转换成小写的形式,在 ASP.NET Core 中,微软提供了 RoutingServiceCollectionExtensions.AddRouting 这个扩展方法可以让我们将 URL 地址转换成小写。
  打开项目的 Startup.cs 文件,找到 ConfigureServices 方法,在方法体内添加下面的代码。

services.AddRouting(options =>
{
options.LowercaseUrls
= true;
});

  示例项目的顶部链接代码如下所示,运行项目可以看到,通过设置小写路由后,程序根据 Controller 和 Action 自动生成的 URL 地址全部变成了小写。仔细观察可以发现,这里会出现一个问题。在某些特殊的情况下,Area/Controller/Action 可能是由多个英文字母拼接而成的一个混合英文单词,如果把这个混合的单词全部进行小写而不进行拆分的话,整个项目的 URL 可读性更低了。

640?wx_fmt=png


  在 Startup 类中的 Configure 方法里,我们定义了针对包含 Area 和不包含 Area 的两个路由模板,整个项目的 URL 都是根据这两个模板进行生成的。那么这里我们是不是可以通过对单个 Controller 或是 Action 指定特殊的 URL 格式呢?

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

routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
});

  答案当然是可以的。在 ASP.NET Core 中,我们可以通过在 Controller 或是 Action 方法上添加 RouteAttribute 的方式将用户自定义路由信息添加到项目的路由表中。例如这里我在 DraftSetting 这个 Action 上使用特性路由的方式手动指定当前 Action 生成特殊的 URL 格式。 

public class PostController : Controller
{
[Route("post/draft-setting")]
public IActionResult DraftSetting()
{
return View();
}
}

640?wx_fmt=png

  虽然这样可以解决我们的问题,可以一旦项目有新增页面时,就要手动的指定特性路由地址,这样似乎有些麻烦。那么,如何自动的让程序帮我们实现这一功能呢?

  在 ASP.NET Core 2.2 版本中,微软为我们提供了参数转换器这一概念,我们可以通过实现 IOutboundParameterTransformer 这个接口,从而将 URL 中路由的值或者是 URL 中路由参数的值按照我们的需求进行转换。就像下面的代码中,我通过实现这个接口,从而实现将多个英文单词生成的混合单词以 hyphen(-) 的形式进行分隔。

public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
public
string TransformOutbound(object value)
{
return
value == null
? null
: Regex.Replace(value.ToString(), "([a-z])([A-Z])"
, "$1-$2").ToLower();
}
}

  这里我使用 hyphen(-) 作为 URL 中各个单词间的连字符,是因为对于搜索引擎来说,它会将 - 视为单词间分隔符,采用这种风格的 URL 更有利于搜索引擎收录。

  当接口功能实现之后,我们就需要对我们的默认全局路由进行修改。首先,我们需要在路由模板上指定需要替换的路由参数,这里我们指定 Area、Controller、Action 是需要进行路由参数转换的变量。

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

routes.MapRoute(
name: "areas",
template: "{area:exists:slugify}/{controller:slugify=Home}/{action:slugify=Index}/{id?}"
);
});

  当定义好参数转换器以及需要转换的 URL 路由参数后,我们就可以在 AddRouting 方法中通过 ConstraintMap 进行配置需要转换的参数路由值。至此就可以完成我们进行路由参数转换的结果。

services.AddRouting(options => {
options.ConstraintMap["slugify"
] = typeof(SlugifyParameterTransformer);
options.LowercaseUrls
= true;
});

640?wx_fmt=gif

 三、总结

    在本章中,我们主要是调整了 ASP.NET Core 项目中的默认路由,从而使项目的 URL 地址具有更好的可读性。通过使用小写路由和 hyphen(-) 路由,只是构建可读性更高的 URL 地址的第一步,在构建页面时,我们更应该考虑的是如何使用少数的单词就可以让用户清楚当前页面的功能,更简短,更易读的 URL 不仅对于用户,对于搜索引擎也是更友好的。

原文地址:https://www.cnblogs.com/danvic712/p/10952541.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

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

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

相关文章

CF605C. Freelancer's Dreams

CF605C. Freelancer’s Dreams 题目描述 Solution 实际上就是给定ai,bi,A,Ba_i,b_i,A,Bai​,bi​,A,B,求n维向量(x1..xn)(x1..x_n)(x1..xn​),使得: ∑i1naixi≥A∑i1nbixi≥Bminz∑ixi\sum_{i1}^na_ix_i\geq A\\ \sum_{i1}^nb_ix_i\geq B…

CF908G. New Year and Original Order

CF908G. New Year and Original Order Solution 对于一个数xxx,它的贡献为排序之后的值,例如:S(50394)34593∗1034∗1025∗1019S(50394)34593*10^34*10^25*10^19S(50394)34593∗1034∗1025∗1019,也就是每一个数值乘以若干个101…

【18】ASP.NET Core MVC 中的 Model介绍

ASP.NET Core MVC 中的 Model在本视频中,我们将通过一个示例讨论 ASP.NET Core MVC 中的 Model。我们希望最终从 Student 数据库表中查询特定的学生详细信息并显示在网页上,如下所示。MVC 中的模型包含一组表示数据的类和管理该数据的逻辑。 因此&#x…

使用 Powershell 远程连接 windows server

使用 Powershell 远程连接 windows serverIntro最近我们的开发环境增加了一个 windows 服务器,没有界面的,不能直接远程桌面连上去管理,需要使用 Powershell 管理,于是就有了这篇文章的探索。windows服务器配置以下所有命令需要在…

[BZOJ2616] SPOJ PERIODNI

[BZOJ2616] SPOJ PERIODNI 题目描述 Solution 这题有个高大上的名字——笛卡尔树DPDPDP。 然而其实就是一个简单的区间DP而已。 设fl,r,jf_{l,r,j}fl,r,j​表示当前要求的区间为[l,r][l,r][l,r],已经选择了jjj个棋子的方案数,考虑怎么划分子问题&…

.NET Core WEB API中接口参数的模型绑定的理解

在.NET Core WEB API中参数的模型绑定方式有以下表格中的几种:微软官方文档说明地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-api/?viewaspnetcore-2.1特性 绑定源[FromHeader]请求标头[FromQuery]请求查询字符串参数[FromForm]请求正文中的…

CF1004F Sonya and Bitwise OR

CF1004F Sonya and Bitwise OR Solution 感觉比较套路。 序列的前缀ororor有一个性质:最多变换logloglog次。 所以直接建一个线段树,每个区间对于前缀、后缀分别存下O(log)O(log)O(log)个断点、ororor值以及ansansans,这样就能够很容易地…

ASP.Net Core Razor 部署AdminLTE框架

1、AdminLTE一个基于 bootstrap 的轻量级后台模板2、AdminLTE 文档在线中文Demo:http://adminlte.la998.com/在线中文文档:http://adminlte.la998.com/documentation/index.htmlGithub:https://github.com/almasaeed2010/AdminLTE/releases3、…

CF1178H Stock Exchange

CF1178H Stock Exchange 题目描述 简要题意:给定2n2n2n个一次函数yaixbi(a,b>0)ya_ixb_i(a,b>0)yai​xbi​(a,b>0),刚开始你有前nnn个函数各一个,在任意时刻ttt,xxx函数可以转换为yyy函数当且仅当axtbx>aytbya_xtb_…

.NET CORE 对接天翼云 OOS

最近,因公司项目需要对接天翼云OOS,在百度多次折腾后,大部分的都是基于java、php 等其他语言,很少基于C#语言的相关资料,即使有也是基于.NET Framwork开发的SDK,内容几乎是千篇一律,很少基于.NE…

盘点618 .NET 程序员必“败”书单

六月到了,有三个节日迎接我们,心中微微一盘算:儿童节和端午节仿佛对我们都不重要。我们期待的只有:618狂欢购物节!没错一年一度的618来了,哪些书值得买? 小编盘点了2019年1-5月.NET 相关的图书,…

CF1028F. Make Symmetrical

CF1028F. Make Symmetrical 题目描述 Solution 结论1:两个点(x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2)(x1​,y1​),(x2​,y2​)关于(0,0),(x3,y3)(0,0),(x_3,y_3)(0,0),(x3​,y3​)对称的必要条件为(x1,y1)(x_1,y_1)(x1​,y1​)和(x2,y2)(x_2,y_2)(x2​,y2​)在同一个…

ApplicationInsights的探测器尝鲜

通常我们可以依靠ApplicationInsights(以下简称ai)来收集比如请求(request),依赖项(dependencies),异常(exception)等信息,但是无法收集到比如一个方法(方法内部比如没有依赖项调用)的信息。很多时候如果一个方法很慢,…

CF917C. Pollywog

CF917C. Pollywog 题目描述 Solution 看完题,基本的方向就是状压DP。 因为每次都是最左边的青蛙跳至多kkk步,容易发现任意两个青蛙之间的距离始终小于kkk。 因此可以把连续kkk个位置的空闲状态压在(kx)≤70\binom{k}{x}\leq70(xk​)≤70个二进制数中…

开源/免费界面自动化测试工具对比研究

摘要:随着我行自动化测试实施范围的不断扩大,参与界面自动化测试的应用系统越来越多。我行的应用系统现阶段多采用商用工具QTP(UFT)作为执行工具来进行界面自动化测试,采购的QTP license是有限的,使得资源的…

CF1119G. Get Ready for the Battle

CF1119G. Get Ready for the Battle 题目描述 Solution 妙妙构造题。 考虑这样一个过程&#xff1a;所有人一起打第一个怪&#xff0c;每次打nnn&#xff0c;最后剩下k1<nk_1<nk1​<n&#xff0c;就找一些加起来正好为k1k_1k1​的组打掉k1k_1k1​&#xff0c;剩下的…

使用 ConfigMap 挂载配置文件

使用 ConfigMap 挂载配置文件Intro有一些敏感信息比如数据库连接字符串之类的出于安全考虑&#xff0c;这些敏感信息保存在了 AzureKeyVault 中&#xff0c;最近应用上了 k8s 部署&#xff0c;所以想把 AzureKeyVault 的信息迁移到 ConfigMap&#xff0c;不再依赖 AzureKeyVaul…

CF1158D. Beautiful Array

CF1158D. Beautiful Array Solution 构造 对于所有点(xi,yi)(x_i,y_i)(xi​,yi​)选择yiy_iyi​最小的点作为起点&#xff0c;每次考虑下一步若是LLL&#xff0c;则往最右边&#xff08;与当前线段夹角最大&#xff09;的点走&#xff0c;否则往最左边的点走。 时间复杂度O…

SciSharpCube:容器中的SciSharp,.NET机器学习开箱即用

SciSharp Cube在Docker容器中快速体验SciSharp机器学习工具的最新功能。项目地址(原文链接)&#xff1a;https://github.com/SciSharp/SciSharpCube从Docker Hub运行docker run --name scisharp -it -p 8888:8888 scisharpstack/scisharpcube这条命令会拉取最新的SciSharpCube镜…

CF704B. Ant Man

CF704B. Ant Man Solution 经典dpdpdp&#xff0c;第一次见好像是在ZJOIZJOIZJOI的某题&#xff1f; 先按xxx排序 用f[i][j]f[i][j]f[i][j]表示放入前iii个数&#xff0c;有jjj个端点&#xff08;不算边界点&#xff09;的最小代价。 每次可以&#xff1a; 1.合并两段折线 2.…