私は専門家と連絡を取り合い、プロジェクトを見て以下のように答えました。
(ちなみに私が持っている「のcgi-binの」ルートのように、以前に私が変更することはできませんApacheサーバおよびその上でホストされている自分のドメインに関連する野生の古いURLのアウトがあります。)
Answer もう少しmvcヘルパーのソースコードを掘り出しました.2つの問題(私は同様の問題がありましたHtml.BeginForm with overload causes form action to be '/cgi-bin?action=Index&controller=Home' and so the HomeController is bypassed)は、Url.ActionとHtml.BeginFormが1つの同じメソッド:UrlHelper.GetUrl ...さて、このメソッドの機能は次のとおりです。
- 現在のURL(コントローラ、アクション、エリアなど)
- 指定したパラメータを追加または置き換えます。
- 最適なルートを見つけよう! < ==
- ルート変数がある場合は、提供されたパラメータをそれらの変数にプッシュします。クエリ文字列にパラメータの
- スティック残り< ==
私が意図的に最も重要である点3と、ポイント3 & 5強調しています。そのため、UrlHelper.GetUrl(およびそれぞれUrl.ActionとHtml.BeginForm)はルートを必要とし、利用可能なルートを検索して最初の一致を検索します。
ここでは、混在したwebforms-mvcアプリケーションの問題があります。これは、MVCだけを扱うときは表示されません.MapPageRouteを使用しています。 MapRouteとは異なる点に注意してください。そしてMapPageRouteはPageRouteHandlerクラスを使用してルートを作成しますが、MapRouteはMvcRouteHandlerクラスを使用しますが、PageRouteHandlerは常にUrlHelper.GetUrl( "ActionName"、 "ControllerName")に適した方法でルートを作成するため、アクション名とコントローラ名がパラメータとしてクエリ文字列にスローされます(ポイント5)。
だから、何がUrl.Actionは、経路探索され、MapPageRouteによって、あなたのケースで作成された最初のものに当たっていることを、あなたのセットアップとされて起こるこれです:
routes.MapPageRoute(「CGI- bin "、" cgi-bin/{* theRestcgi-bin} "、"〜/ home/Search。aspxの ");クエリ文字列のその不可解なのcgi-binの部分はフレームワークは、実際にいくつかの仮想/物理フォルダを探しているという印象を与えて、どこから来る
だ適切な解決策については
:どちらか。適切なルートを定義するか、URLを単純な文字列として指定してください。私は、あなたのソリューションはRouteConfigクラスのルート定義を移動する必要がないので、あなたの解決策が優れていると考えています。
質問に間違った出力を生成している関連コード? – Shyju