より読みやすいASP.NETコアルーティングを構築

オリジナル: 読みやすくASP.NETコアルーティングを構築

 I.はじめに

  あなたはサイトの大半のURLアドレスは小文字です、通常はインターネットを気づいていない、とC#クラス名とメソッド名に使用されているので、我々は、.NET / .NETのコアMVCの開発プロジェクトを使用しているとき、私は知りません.NETフレームワークのデフォルトのルーティングルールに基づいて、パスカルの命名規則は、プロジェクトのURLアドレスは、大文字と小文字の場合を示すことになります。このような状況は容認されてはならない強迫性障害については、当然のことながら、プロジェクト小文字混在表示のURLアドレスので、現在のページを表現するために、ユーザは、ブラウザの機能を明確にすることはできません。さて、この記事では、我々のプロジェクトのURLアドレスが読みやすくなるように、私たちのルーティングルールASP.NETコアプロジェクトを調整する方法を、次をご紹介します。

  PS:アドレス大文字または小文字のアドレスにURLを構築するプロセスでは、誰もがそうするために自分のアイデアや理由があるだろう、この記事では、二つのプログラムのメリットを議論することではなく、建物の小文字を提供するために、 URLアドレスと当社のソリューションより読みやすいURLを作る、友好を見てくださいは、お互いを嫌いではありません。

  コード倉庫:https://github.com/Lanesra712/grapefruit-common

 ステップバイ二、ステップ

  それは大文字のURLルーティング、または小文字のURLルーティングの使用の使用であるかどうか、プロジェクトのルートを構築するとき、私たちは、最初に確認する必要があり、我々はプロジェクト全体の統一URLフォーマットする必要があるということです。他の部分は小文字のURLアドレスを使用している間にURLアドレスは、資本金プロジェクトの一部と言うことはできません。同時に、ページの大文字と小文字のルートパスと、最終的にサーバーが同じ2つのアドレスのページへのすべてのポイントは、かもしれませんが、検索エンジンのために、これは間違いなく2ページですけれども。

  他の人が面白いサイトを語ってくれたとき、私たちはそれにアクセスするには、ブラウザのアドレスバーからURLを入力して次のことを考えてみましょう。我々はそれが中国語や英語の入力方法入力方法であるかどうか、URLアドレスを入力すると、URL入力で大文字がある場合、文字の出力は、ああ、我々はまた、CapsLockキー、キースイッチケースを使用する必要があり、この時点では、小文字です。

  アプリケーションがLinuxサーバの言葉に配備された場合に加えて、我々は、パスは大文字と小文字を区別しませんので、我々はそれを間違ったアドレスの場合を取得する場合、我々は通常の訪問することができ、Windowsサーバのそれを知っているが、 。

  読みやすくするために、この概念は少し主観的に見えるかもしれません。私たちは、ウェブサイトに直面しているとき簡単に言えば、我々は明らかにこのウェブサイトを経由して、このページの主な内容を知ることができます。例えば、それはページを開いていないかもしれないが、我々は、このサイトwww.youdomain.com/editor/post/new見るが、我々は大体このページは新しい記事かもしれ推測することができます。あなたが受け取るURLは、このようなwww.youdomain.com/9rg7f2/i?HXI-D+iaj34ある場合は、誰もが、それは、このページのやっている最後に知ることはできません。

  そのため、簡単に入力するために、まず私たちはASP.NETコア内の小文字のフォームに、当社のURLアドレスを変換する必要があり、MicrosoftはRoutingServiceCollectionExtensions.AddRoutingが提供するこの拡張メソッドは、私たちはURLが小文字に変換することができます。
  Startup.csプロジェクトファイルを開き、ConfigureServices方法を見つけ、メソッド本体に次のコードを追加します。

services.AddRouting(オプション=> 
{ 
    options.LowercaseUrls = ; 
});

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

<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>

  在 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(-) 的形式进行分隔。

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 不仅对于用户,对于搜索引擎也是更友好的。

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/10955158.html