RestfulルーティングのためのASP.NET RUBY on Rails routing DSLに基づくMVC。 コントローラの構造を最適化しながら、一意のパスを最小限に抑えるためにHTTP動詞をutlizesします。

PM>Install-Package RestfulRouting

Restful RoutingへようこそASP.NET MVC! ルーティングは間違いなくすべてのコアにありますASP.Net MVCアプリケーション。 ルートを自分で管理することは、面倒でイライラし、非生産的になる可能性があります。 一部の開発者は、アプリケーションが成長するにつれて予期しない問題につながる可能性があり、キャッチオールルートを利用しています。 Restful Routingは、ルートを登録するための独自のインターフェイスを提供することで、ルーティング管理の問題を解決します。

このライブラリはとても使いやすいので、あなたが今までどのように開発したのか疑問に思うことを願っていますASP.Net それなしのMVCアプリケーション。

ゴールデンセブン

Resourcesゴールデンセブン

ゴールデンセブン

ゴールデンセブン

:

アクション HTTPメソッド
インデックス 取得
表示 取得
作成 投稿
新規 取得
編集 取得
更新
破棄 削除

Restfulルーティングの目的は、コントローラを納得させることです。 適切な場合はルールを曲げることができますが、すべてのコントローラをこれらの七つのアクションに限定することに あなたがRestfulルーティングの慣習と戦うならば、あなたは私たちの独断的なフレームワークの強さを活用することはなく、そうすることは悲惨です。

デフォルトルート

Restfulルーティングに飛び込む前に、私はによって提供されるデフォルトルートを議論したいと思いますASP.NET MVCです。 多くのスターターテンプレートに見られる、それは始めるときに便利なツールですが、私はあなたが任意の本番環境のためにそれを使用することはお勧 私は以下の理由をリストします:

  • Restful Routingのようなルーティングフレームワークに登録されていなくても、プロジェクト内のコントローラにアクセスできます。
  • 予期しない外部ルートの解決とデバッグの時間につながる可能性があります。

ステップ1。 Restful Routing

のインストールを開始するには、既存のRouting

を使用して開始することを前提としています。ASP.Net MVCプロジェクトとその点に到達する方法を理解しています。

パッケージマネージャコンソールを開き、次のように入力します。PM> Install-Package RestfulRouting

パッケージマネージャコンソールを使用しない場合は、webプロジェクトを右クリックし、”Nugetパッケージの管理”コンテキストメニュー項目を選択できます。 RestfulRoutingを検索してパッケージをインストールします。

ステップ2。 Restfulルーティングの設定

プロジェクトにいくつかの変更が起こったはずです。Routes.csApplicationControllerの二つのファイルが追加されました。

Routes.csは右のセクションのようになります。 私たちはすでにこのファイルにあなたのために含まれている少しの助けを持っています。 誰もがブログアプリケーションを書いているわけではないので、あなたがそれを見た後、コメントされたコードを消去して自由に感じます。

WebActivatorへの依存関係に注意してください。 Startメソッドを自分で呼び出す場合は、この依存関係を削除することを選択できます。

// setting the root routemap.Root<HomeController>(x => x.Index());

ご使用の設定では、

// setting the root routemap.Root<HomeController>(x => x.Index());
// setting the root routemap.Root<HomeController>(x => x.Index());

Root;

Routes.csに加えて、ApplicationControllerも取得します。 この基本コントローラの使用はオプションですが、Format Results

Step3を利用するために必要なコードがあります。 ビューエンジンの構成(オプション)

ASP.Net MVCは、ビューを見つけるためにビューエンジンに依存します。 デフォルトのビューエンジンはokですが、フォルダ構造は少し冗長であることがわかりました。 あなたは私たちのビューエンジンを利用したい場合は、あなたのグローバルを変更します。asaxファイルは次のようになります。

コード! コード! コード!

あなたのルートの登録でどのように、何が起こっているかについての詳細を学びたい場合は続きを読みます。

ルートセット

このセクションでは、RouteSetについて学びます。 このクラスは、Restfulなルーティングを機能させるために重要です。

基本

ルートセットはルートマッピングのコレクションです。 アプリケーション内のルートを定義するだけでなく、他のルートセットに接続することができ、最小限の労力で豊富なルートセットを作成できます。

すべてのルートは、RouteSetのMapメソッド内で定義されます。

Mapに渡されたIMapperインスタンスは、ルートをすべての辞書の中心にあるRouteTable辞書にマップする方法を示します。

接続

ルートセットを論理的に分離したい場合があります。 すべてのルートを単一のルートセットにグループ化するのではなく、ルートセットを接続する機能を提供します。 ルートセットのルートになるように1つのルートセットを選択する必要があり、その後、任意の方法で他のルートセットを接続できます。 ルートセットは、領域と同様の名前空間もサポートします。

設定(オプション)

ルートセットには、ルート登録の動作を変更できる設定が用意されています。 これらのプロパティは、RouteSetのコンテキスト内で見つけることができます。 ほとんどの開発者は、これらの機能に触れたくないでしょう。

設定 デフォルト 結果
ローワーケース true 小文字のインバリアントカルチャでurlを登録する
LowercaseDefaults true 通常登録時のアクションを小文字の不変カルチャに登録します。
LowercaseActions true Routeに登録したときのアクションを小文字のインバリアントカルチャに登録します。
MapDelete false を登録します。 削除の追加アクション。 リソースを削除する前に削除確認ページを表示するために使用します。

マッピング

Restful Routingはマッピングフレームワークであり、マッピングを行うために概念とインターフェイスのセットを提供します。 以下の各インターフェイスと、それぞれが詳細に提供する機能についてお読みください。

Root

map.Root<HomeController>(x => x.Index());

すべてのアプリケーションにはデフォルトのページが必要で、ルートパスの登録はかつてないほど簡単でした。 アプリケーションがでホストされていた場合、それはルートとみなされます。

アプリケーションはルートを一つだけ持つことができます。

リソース

map.Resource<ProfileController>();

リソースは、アプリケーションユーザーの視点から単独で考えることができる”もの”です。 認証されたユーザーのプロファイルは、リソースの良い例です。 次のurlを見てみましょう。 プロファイルに関しては、cookie(または他の暗黙の手段)を介して識別子を導出し、ルートのパスに識別子を必要としません。

このurlは、アプリケーションがプロファイルとその提示方法を知っていることを前提としています。 今、RouteSetで登録はどのように見えますか?

アクションとHttpメソッド

リソースを登録すると、アクションとメソッドのセットが自動的に登録されます。 コントローラを登録し、アクションを実装します。

アクション HTTPメソッド
表示 取得
作成 投稿
新規 取得
編集 取得
更新
破棄 削除

この例では、ProfileControllerを使用すると、次の出力が得られます:

アクション HTTPメソッド Result(controller#action) Url
SHOW GET profile#show /profile
新しい 取得 プロファイル#新しい /profile/new
作成 投稿 プロファイル#作成 /プロファイル
編集 取得 プロファイル#編集 /プロファイル/編集
更新 プット プロファイル#更新 /プロフィール
DESTROY DELETE profile#destroy /profile

名前付け

コントローラに一つの名前を付けることがありますが、リソースurlに完全に別のものを反映させたいと思うことがあります。 これは簡単です。

profile#showの新しいurlが

Additionally, you can change the default action names of a resource by using the PathNamesメソッドに変更されます。 これは推奨されませんが、私たちはあなたにオプションを与えるのが好きです。

アクションの選択

リソースに対して提供するすべてのメソッドが必要ない場合があります。 次の例を想像してみてください:

  • ユーザーとしては、登録時に暗黙的に作成されるため、プロファイルを作成することはできません。
  • ユーザーとして、私は現在のプロフィールを編集できるはずです。
  • ユーザーとして、私は自分のプロフィールを削除することはできません。
  • ユーザーとして、私は自分のプロフィールを見ることができるはずです

レビュー後、次のアクションを登録するだけで済みます: Show, Edit, Update. リソースをこれらのアクションに制限するには、RouteSetで次のコードを使用します。

リソースのネスト

// NESTING A RESOURCEmap.Resource<ProfileController>(profile => { profile.Resource<CreditCardController>()});

リソースは別のリソースに依存することがあります。 リソースを入れ子にするときは、親リソースとその依存リソースの間に一対一の関係があります。

creditcardリソースを作成し、それをprofileリソース内にネストすると(右に記載されているように)、プロファイルルートを除いて結果のルートが取得されます:

Action HTTP Method Result (controller#action) Url Template
SHOW GET creditcard#show /profile/creditcard
NEW GET creditcard#new /profile/creditcard/new
CREATE POST creditcard#create /profile/creditcard
EDIT GET creditcard#edit /profile/creditcard/edit
UPDATE PUT creditcard#update /profile/creditcard
DESTROY DELETE creditcard#destroy /profile/creditcard#destroy /profile/creditcard#DESTROY

リソース

map.Resources<ProductsController>();

リソースは、ドメインを持つコレクションを表します。 ストアアプリケーションを構築する場合、顧客が商品を検索して購入できるようにカタログを公開することができます。 製品は資源とみなされます。 生成されるurlは、提供される多くの製品があることも反映しています。

製品の多元化に注意してください。 電子商取引の場所を始めれば、多分複数のプロダクトを一度に販売する。

アクション

リソースを登録すると、アクションとメソッドのセットが自動的に登録されます。 コントローラを登録し、アクションを実装します。

アクション HTTPメソッド
インデックス 取得
表示 取得
作成 投稿
新規 取得
編集 取得
更新
破棄 削除

この例では、ProductsControllerを使用すると、次の出力が得られます:

名前付け

コントローラに一つの名前を付けることがありますが、リソースのurlに何かを完全に反映させたいと思うことがあります。 これは簡単です。

新しいurlはproducts#indexのために変更されます。

さらに、PathNamesメソッドを使用して、リソースのデフォルトのアクション名を変更できます。 これは推奨されませんが、私たちはあなたにオプションを与えるのが好きです。

{id}パラメータのカスタマイズ

デフォルトでは、ルートURLパターンのリソースidパラメータに名前idが使用されます。 たとえば、上記のproducts#show action in ActionsおよびHTTPメソッドのURLパターンは/products/{id}です。

一部のシナリオでは、パラメーターに別の名前を使用することができます。 パラメータ名をリソースを識別するために使用されるプロパティの名前と一致させたい場合があります。

users#show actionに追加されたルートには、URLパターン/users/{username}

アクションを選択する

時には、私たちが提供するすべてのメソッドが必要ない場合があります。 右側のfollwingメソッドを使用してアクションを削除することができます。

ネストリソース

map.Resources<ProductsController>(products => { products.Resources<ReviewsController>()});

リソースは他のリソースに依存することがあります。 リソースを入れ子にするときは、親リソースとその依存リソースとの間に一対多の関係があります。 持っている製品について考えてみてくださいreviews.To これを達成するには、次のように2つのリソースを登録します。

メンバーとコレクションルート

リソース内のMemberメソッドとCollectionメソッドを使用して、コレクション(idルートパラメーターなし)またはメンバー(idルートパラメーター付き)にルート マップに使用できるメソッドは、Get、Post、Put、Delete、Headです。 リソースのコンテキスト内(単数形)では、Memberメソッドにのみアクセスできます。

標準マッピング

<!-- IN RAZOR VIEW --><a class="btn" href="@Url.Action("usingpath", "extras")">Path</a><a class="btn" href="@Url.Action("usingroute", "extras")">Route</a>

私たちの規則があなたのためにうまくいかないことがあります。 私たちは独断的かもしれませんが、私たちは鉄の拳で支配しません。

二つの追加の方法が提供されているので、カスタムルートを追加することができます。Pathは伝統的なものが混在していますASP.Net インターフェースラッパーを使用したMVCルーティング構文。 ルートは、カスタムルートを追加する非常に伝統的な方法です。

エリアはRestfulルーティングで名前空間によって処理されます。 通常、フォルダと名前空間の間には相関関係があるため、ほとんどの開発者にとって、これはすでに行っていることと大きな違いはありません。

areaメソッドに提供されるコントローラは、グループ化されたコントローラの名前空間を決定するために使用されます。 “Mappings”文字列は、url部分とともに領域の名前を決定するために使用されます。

urlを生成するときに領域を指定する必要があることを覚えておいてください。 領域を終了するには、領域を空の文字列に設定します。 リソースとリソースを持つすべてのルールは、領域を扱うときにも適用されます。

ビューエンジン

Restfulルーティングには、RestfulRoutingRazorViewEngineRestfulRoutingWebFormViewEngineの二つのビューエンジンが付属しています。 これらのビューエンジンの1つを見てみましょう。

これらのビューエンジンは、次のような方法を変更しますASP.Net MVCはビューを探します。

書式結果

これは、リソースとリソースに対して暗黙的な書式拡張を使用できる機能です。 この機能には2つのコアメソッドがあります:RespondTo、WithFormatRoutes。

<system.webServer> <modules runAllManagedModulesForAllRequests="true" /></system.webServer>
namespace RestfulRouting.Documentation.Controllers{ public abstract class ApplicationController : Controller { protected ActionResult RespondTo(Action<FormatCollection> format) { return new FormatResult(format); } }}
// IN ROUTESET// enable format routesextras.WithFormatRoutes();

私たちは、私たちの流暢なインターフェイスを少し良く使用するために、箱から出して既知のタイプのセットを提供しますが、私たちはあなたが考える これらの形式ルートを生成するには、次のように形式を指定します。

素晴らしいでしょうか?! フォーマットルートの使用を計画している場合は、Quirks/Gotchasの次のセクションを読むことをお勧めします。彼は、単一ページのアプリケーションを構築している場合に役立ちます控えめに使用し、それがあなたの行動に機能を分離することが適切であるとき

私たちは他の人よりも良いurlの決定を行うときがあります。 既存のurlを壊すことなくurlを変更できるようにしたいと考えています。 これは、アプリケーションが稼働した後にのみ必要です。 これは主に公開されているサイトに適用されますが、イントラネットのsitutationで有用である可能性があります。

最初に注意すべきことは、すべてのリダイレクトルートをリストの最後のルートとして登録する必要があることです。 これは、彼らが最も重要ではないからです。 古いリンクにアクセスしたときにのみヒットします。 あなたのアプリケーションはこれらのurlを生成すべきではありません、そしてそれがそうであればあなたは問題を抱えています。第二に、登録はRestfulRoutingの古き良き構文のように見えますが、定義内にネストする必要はありません。 私はDeadLinksまたはRedirectと呼ばれるRouteSetを作成し、マスター RouteSetの最後に接続することをお勧めします。

最後に、これは重要ですが、R E D I E Ntroutefilterattributeをグローバルフィルタとして登録します。右に表示されているように、古いurlを設定し、新しいurlに解決する値を指定するだけです。 私たちは、最良の一致するルートを見つけるためにカバーの下にUrlHelperを使用します。

Route Debugger

// IN ROUTESETmap.DebugRoute("routedebug");

Restful Routingには、ルートマッピングを理解するのに役立つ強力なルートデバッガが付属しています。 ルートセットに次の行を追加することで、ルートデバッガーを有効または無効にすることができます。

Quirks/Gotchas

このセクションでは、いくつかのquirksを詳細にしようとしていますASP.NET MVCとRestfulルーティング。 これらは時々問題を引き起こす可能性があり、アプリケーションに影響を与える理由と時期を理解することをお勧めします。

ASP.Net MVCは常に参考にしようとします。 役に立つ、善意が、時にはいくつかの奇妙な行動につながることができます。 最大の問題は、既存の要求からルート値を保存することができます。

この癖を理解することは、Restfulなルーティングだけでなく、多くの問題をデバッグするのに役立ちますASP.NET MVC一般的に。 あなたは右の例を見ることができます。

map.Resource<ProfileController>(profile => { // DOH! should be profile // not map! // EXCEPTION!!!! map.Resource<CreditCardController>()});

map.Resource<ProfileController>(profile => { // DOH! should be profile // not map! // EXCEPTION!!!! map.Resource<CreditCardController>()});

map.Resource<ProfileController>(profile => { // DOH! should be profile // not map! // EXCEPTION!!!! map.Resource<CreditCardController>()});

RouteSetの作成中に、誤って間違ったパラメータを呼び出すことがあり、診断が困難なエラーにつながる可能性があります。 私たちの例外は役に立ちますが、これは十分に一般的な間違いであり、それを文書化することにしました。

名前空間と名前の競合

コントローラに同じ名前を付けたいが、異なる名前空間にしたい場合があります。 これはあなたの場所の管理上および前部表面仕上げセクションを造るとき適切である。 Routingが正しいコントローラをインスタンス化できるように、名前空間を適切に設定することを忘れないでください。