不知你在平时上网时有没有注意到,绝大多数网站的 URL 地址都是小写的英文字母,而咱们使用 .NET/.NET Core MVC 开发的项目,由于在 C# 中类和方法名采用的是 Pascal 命名规范,根据 .NET 框架默认的路由规则,项目的 URL 地址会呈现出大小写混合的状况。对于强迫症来讲,这种状况绝对不能忍,固然,因为整个项目的 URL 地址大小写混合显示,也没法更清晰的向用户、浏览器表达出当前页面的功能。那么,这篇文章就来介绍下,如何调整咱们的 ASP.NET Core 项目的路由规则,从而使咱们项目的 URL 地址可读性更高。html
PS:在构建 URL 的过程当中,采用大写的地址仍是采用小写的地址,每一个人都会有本身的想法和这样作的理由,这篇文章不讨论两种方案的优劣,只是提供一种构建小写 URL 地址以及让咱们的 URL 可读性更高的解决方案,请友善观看,切勿互怼。git
仓储地址:github.com/Lanesra712/…程序员
在构建项目的路由时,不论是采用大写的 URL 路由,仍是采用小写的 URL 路由,咱们首先须要确保的是,咱们须要将整个项目的 URL 格式进行统一。不能说一个项目一部分的 URL 地址用大写的,而另外一部分采用的是小写的 URL 地址。同时,同一个页面的大写的路径以及小写的路径,虽然最终服务器可能都会将两个地址指向同一个页面,可是对于搜索引擎的收录来讲,这无疑是两个页面。github
试想如下,当别人告诉了咱们一个有趣的网站,咱们从浏览器的地址栏中输入网址进行访问。当咱们输入 URL 地址时,不论是中文输入法仍是英文输入法,输出的英文字母都是小写的,此时,若是输入的网址中存在大写字母,嗯,咱们还须要使用 CapsLock 键进行大小写切换。编程
另外,咱们知道,对于 Windows 服务器来讲,由于对于路径的大小写不敏感,若是咱们弄错了地址的大小写,咱们仍是能够进行正常的访问的,但是,若是将应用部署到 Linux 服务器上的话。。。。 浏览器
打开项目的 Startup.cs 文件,找到 ConfigureServices 方法,在方法体内添加下面的代码。服务器
services.AddRouting(options =>
{
options.LowercaseUrls = true;
});
复制代码
示例项目的顶部连接代码以下所示,运行项目能够看到,经过设置小写路由后,程序根据 Controller 和 Action 自动生成的 URL 地址所有变成了小写。仔细观察能够发现,这里会出现一个问题。在某些特殊的状况下,Area/Controller/Action 多是由多个英文字母拼接而成的一个混合英文单词,若是把这个混合的单词所有进行小写而不进行拆分的话,整个项目的 URL 可读性更低了。app
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">Sample</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Post" asp-action="DraftSetting">Draft Setting</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
复制代码
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();
}
}
复制代码
在 ASP.NET Core 2.2 版本中,微软为咱们提供了参数转换器这一律念,咱们能够经过实现 IOutboundParameterTransformer 这个接口,从而将 URL 中路由的值或者是 URL 中路由参数的值按照咱们的需求进行转换。就像下面的代码中,我经过实现这个接口,从而实现将多个英文单词生成的混合单词以 hyphen(-) 的形式进行分隔。asp.net
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;
});
复制代码
在本章中,咱们主要是调整了 ASP.NET Core 项目中的默认路由,从而使项目的 URL 地址具备更好的可读性。经过使用小写路由和 hyphen(-) 路由,只是构建可读性更高的 URL 地址的第一步,在构建页面时,咱们更应该考虑的是如何使用少数的单词就可让用户清楚当前页面的功能,更简短,更易读的 URL 不只对于用户,对于搜索引擎也是更友好的。
占坑
做者:墨墨墨墨小宇
我的简介:96年生人,出生于安徽某四线城市,毕业于Top 10000000 院校。.NET程序员,枪手死忠,喵星人。于2016年12月开始.NET程序员生涯,微软.NET技术的坚决坚持者,立志成为云养猫的少年中面向谷歌编程最厉害的.NET程序员。
我的博客:yuiter.com
博客园博客:www.cnblogs.com/danvic712