からのルート値を継承Url.RouteUrl(...)を防ぐために、どのようにしてあるマストヘッドで、は、現在のリクエスト
// ProductsController.cs
public ActionMethod Index(string gender) {
// get all products for the gender
}
他の場所でショッピングカートに製品を表示するためのアクションメソッドを持っているとしましょう
<a href="<%= Url.RouteUrl("testimonials-route", new { }) %>" All Testimonials </a>
このtestimonials-route
は、下記の最初のルートでglobal.ascx
で定義されています:あなたは、サイト上の他のページへのHREFリンクを作成するために、Url.RouteUrl
を使用しているすべてのページに表示されます。 上記のRouteUrl
の呼び出しにはgender
が含まれていませんが、ルートはデフォルトの 'ニュートラル'で定義されているため、Testimonials.Index( "ニュートラル")が呼び出されると考えられます。
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)" }
);
誰かがページ/products/women
を訪問した場合、我々は、誰かがページ/products
を訪れたならば、我々は(RouteUrlへの呼び出しはnullを返します)、空のHREFを取得/testimonials/women
にHREFを取得します。
しかし、それは意味がありませんか? testimonials-route
は、ルート値を指定しないとデフォルトで'neutral'
になっていますか?
何判明起こっていることUrl.RouteUrl(routeName, routeValues)
ヘルパー拡張子が最初gender
ルート値のためにそのrouteValues
パラメータになりますということであり、それはその辞書でそれを見つけることができなかった場合、それは我々が(にしている現在のURLを見ていきますUrlは現在のリクエストのコンテキストを持つUrlHelperオブジェクトであることに注意してください)。
私たちがメンズ製品のページにいる場合、これは男性の栄誉へのリンクを与えるという意味では効果がありますが、RouteUrl
コールの値を渡して明示的に明示しないと、 global.asax.cs
ファイルでデフォルトとして 'neutral'を指定しました。
/products/
を訪問した場合、私たちは'products-route'
ルートをトリガーし、Products(null)
メソッドが呼び出されました。 testimonials-route
を使用してURLを作成する場合、Url.RouteUrl()
の呼び出しは実際にはgender
のこのnull値を継承します。 gender
のデフォルトを'testimionials-route
'に指定しても、このヌル値は引き続き使用され、ルートは失敗し、RouteUrl
はnullを返します。 [ノート:(男性|女性|ニュートラル)に制約があり、ヌルが適合しないためにルートに失敗しました]
実際には「コントローラ」と「アクション」が継承できます同じ方法。これにより、デフォルトコントローラを持つ明示的なルート名でRouteUrl(...)を呼び出す場合でも、URLが間違ったコントローラに完全に生成されることがあります。
この場合、いったんそれを理解すれば、非常に簡単にさまざまな方法で修正できますが、それ以外の場合には危険な動作を引き起こす可能性があります。これは設計上の可能性がありますが、間違いなく恐ろしいものです。
元の質問の1年半後に賞金を追加する理由は、(a)フレームワークが今私のためにこれを行うかどうかを知りたいのですが、(b)なぜこれに2つのアップフォースしかないのか非常に不思議です。それは一般的な問題だと思ったので、私は何か間違っていると思っています! –
{domain}タグには値がないのに、システムが自動的に提供するはずなので、これは私のブーティーを蹴っていました。一度これを変更すると、うまくいきました。 –
RenderUrlを次のように呼び出してみましょう: '" ' - 何も上書きされません。 – Gerwald