ショッピング カートに商品を表示するアクション メソッドがあるとします。
// ProductsController.cs
public ActionMethod Index(string gender) {
// get all products for the gender
}
Url.RouteUrl
他の場所では、サイト上の他のページへの HREF リンクを作成するために使用しているすべてのページに表示されるマストヘッドで:
<a href="<%= Url.RouteUrl("testimonials-route", new { }) %>" All Testimonials </a>
これは、以下の最初のルートtestimonials-route
で定義されています。global.ascx
上記の への呼び出しでRouteUrl
は が提供されませんgender
が、ルートはデフォルトの「中立」で定義されているため、Testimonials.Index("neutral") が呼び出されることが予想されます。
routes.MapRoute(
"testimonials-route",
"testimonials/{gender}",
new { controller = "Testimonials", action = "Index", gender = "neutral" },
new { gender = "(men|women|neutral)" }
);
routes.MapRoute(
"products-route",
"products/{gender}",
new { controller = "Products", action = "Index", gender = (string)null },
new { gender = "(men|women|neutral)" }
);
誰かがページにアクセスすると、HREF/products/women
を取得します。/testimonials/women
誰かがページ/products
にアクセスすると、空の HREF を取得します (RouteUrl の呼び出しは null を返します)。
でもそれって意味ないですよね?ルート値を提供しない場合、testimonials-route
デフォルトであるはずですか?'neutral'
何が起こっているかというと、Url.RouteUrl(routeName, routeValues)
ヘルパー拡張機能は最初にrouteValues
パラメーターでgender
ルート値を探し、その辞書で見つからない場合は現在の URL を調べます (Url は UrlHelper オブジェクトであることを思い出してください)。利用可能な現在のリクエストのコンテキストを持っています)。
これは、男性用の製品ページにいる場合、男性用の証言へのリンクを提供するというおそらく良い効果がありますが、RouteUrl
呼び出しで値を渡さず、明示的に「ニュートラル」をglobal.asax.cs
ファイルのデフォルト。
訪問した場合、ルート/products/
をトリガーし、メソッドが呼び出されました。の呼び出しは、 を使用して URL を作成するときに、実際に THIS null 値を継承します。inのデフォルトを' に指定しましたが、依然としてこの null 値を使用しているため、ルートが失敗し、null が返されます。[注: (men|women|neutral) に制約があり、null がそれに適合しないため、ルートは失敗します]'products-route'
Products(null)
Url.RouteUrl()
gender
testimonials-route
gender
'testimionials-route
RouteUrl
実際にはもっと恐ろしいことになります - 「コントローラ」と「アクション」が同じ方法で継承できるという点で。これにより、デフォルトのコントローラーを持つ明示的なルート名で RouteUrl(...) を呼び出した場合でも、URL が完全に間違ったコントローラーに生成される可能性があります。
この場合、問題がわかれば、さまざまな方法で非常に簡単に修正できますが、別のケースでは危険な動作を引き起こす可能性があります。これは仕様によるものかもしれませんが、間違いなく怖いです。