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

前言

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

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

        仓储地址:github.com/Lanesra712/…程序员

Step by Step

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

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

        另外,咱们知道,对于 Windows 服务器来讲,由于对于路径的大小写不敏感,若是咱们弄错了地址的大小写,咱们仍是能够进行正常的访问的,但是,若是将应用部署到 Linux 服务器上的话。。。。 浏览器

go die
        至于更好的可读性,这个概念可能会显得有些主观。简单来讲,就是当咱们面对一个网址时,咱们能够很清楚的经过这个网址知道这个网页的主要内容。例如,当咱们看见www.youdomain.com/editor/post/new 这个网址时,虽然可能并无打开这个网页,但咱们仍是能够大体猜到这个页面多是新增文章的。但是,若是你收到的网址是 www.youdomain.com/9rg7f2/i?HXI-D+iaj34 这样的,没人能知道这个页面究竟是干啥的。
go die
        所以,为了便捷输入,首先咱们须要将咱们的 URL 地址转换成小写的形式,在 ASP.NET Core 中,微软提供了 RoutingServiceCollectionExtensions.AddRouting 这个扩展方法可让咱们将 URL 地址转换成小写。

        打开项目的 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>
复制代码

lowercase letters
        在 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();
    }
}
复制代码

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

        在 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;
});
复制代码

URL 设置

总结

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

占坑

        做者:墨墨墨墨小宇
        我的简介:96年生人,出生于安徽某四线城市,毕业于Top 10000000 院校。.NET程序员,枪手死忠,喵星人。于2016年12月开始.NET程序员生涯,微软.NET技术的坚决坚持者,立志成为云养猫的少年中面向谷歌编程最厉害的.NET程序员。
        我的博客:yuiter.com
        博客园博客:www.cnblogs.com/danvic712

相关文章
相关标签/搜索