トップ回答者
MVCのRedirectToActionについて

質問
-
お世話になります。
MVC3で開発を行っておりまして、
RedirectToActionで画面遷移を行うと
VisualStudioでデバッグ実行したときは問題がないのですが
IIS上で実装するとコントローラ名がURLに表示されてしまう現象が発生しております。
例
return RedirectToAction("complete/");
と記述すると
URLが"_001_Test/complete/"
と表示されます。
VisualStudioでデバッグ実行したときは
URLが"/test/complete"
となっています。
情報が不足しているかもしれませんが
何か原因がわかりそうであればご教授いただければと思います。
環境:Win2003、IIS6、framewrok4
よろしくお願いいたします。
回答
-
RedirectToAction は引数に string 1 つを取るメソッドと、2 つ取るメソッドがあります。
http://msdn.microsoft.com/ja-jp/library/system.web.mvc.controller.redirecttoaction(v=vs.98).aspx
今回は引数 1 つなので controller 名は現在の controller 名が使われるので _001_Test となるのが正しい動きだと思われます。
(デバッグ実行時の挙動が謎ですが・・・)あと、string 1 つを取るメソッドは action 名を指定するという仕様なので、引数の末尾に "/" が付いているのは仕様外の使用方法ですね。
内部実装上それでも動くのですが、Helper が出力する URL は概ね末尾の "/" が無い URL となっているので、ここだけ無理に "/" を付けると全体的に不統一になりますね。ちなみに、URL を "/" 終わりで統一したいときは、私の場合は Helper 等 URL を生成する処理を全部自作しています。
かなりめんどくさいです・・・。MCITP(Database Developer/Database Administrator)
- 回答としてマーク 星 睦美 2014年6月9日 6:01
すべての返信
-
説明不足ですみません。
「_001_Test 」はコントローラ名です。
「test 」はURLです。
http//aaa.com/test/action/
から
return RedirectToAction("complete/");
とすると
http//aaa.com/test/complete/
になってほしいのですが。
開発環境では、ASP.NET 開発サーバーを使用しております。
運用環境では IIS の設定は
仮想ディレクトリではなくホームディレクトリを設定しています。
質問の回答になっていますでしょうか?
よろしくお願いいたします。
-
> 環境:Win2003、IIS6、framewrok4
IIS6 では、要求するファイルの拡張子が ISAPI フィルターにマッピングされてないと ASP.NET は動かないので、何らかの対策を取られたと思います。
対策としては以下のページに書いてあるようなオプションがあるそうです。
Deploying ASP.NET MVC to IIS 6
http://blog.stevensanderson.com/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/質問者さんのケースではどのような対策を取られたのか分かりませんが、それが今回の問題に影響を与えていると言うことはないですか?
> MVCは始めたばかりです。ということですと、IIS6 で MVC が動くようにするための設定は、どなたか他の知識・経験がある方がされたのでしょうか? (ご自分で設定してとすると、ここで今回のような質問をするのは解せないです)
そうであれば、その方に聞いてはいかがですか?
- 編集済み SurferOnWww 2014年6月4日 1:40 誤字訂正
-
サーバーが IIS6 で、かつ、
> ハンドラマッピング>ワイルドカードスクリプトマップの追加>apsnet_isapi.dll
という質問者さんの独自設定(?)があるとすると原因はその辺りに間違いなさそうですが、どういう設定をしたのかわかりませんし問題の再現もできませんので、自分には原因究明は無理そうです。
せいぜい言えるのは、対症療法ですが、どうしても RedirectToAction メソッドを使う必要がなければ、それに代えて Redirect メソッドを試してみてははいかがと言うことぐらいです。
Redirect メソッドは指定された URL に直接 Response.Redirect を使ってリダイレクトするということなので、質問者さん独自設定(?)による影響を回避できるかもしれません。
ブラウザのアドレスバーに http//aaa.com/test/complete/ と入力して目的のページ取得して表示できるなら、
return Redirect("~/test/complete/");
として試してみてください。
-
RedirectToAction は引数に string 1 つを取るメソッドと、2 つ取るメソッドがあります。
http://msdn.microsoft.com/ja-jp/library/system.web.mvc.controller.redirecttoaction(v=vs.98).aspx
今回は引数 1 つなので controller 名は現在の controller 名が使われるので _001_Test となるのが正しい動きだと思われます。
(デバッグ実行時の挙動が謎ですが・・・)あと、string 1 つを取るメソッドは action 名を指定するという仕様なので、引数の末尾に "/" が付いているのは仕様外の使用方法ですね。
内部実装上それでも動くのですが、Helper が出力する URL は概ね末尾の "/" が無い URL となっているので、ここだけ無理に "/" を付けると全体的に不統一になりますね。ちなみに、URL を "/" 終わりで統一したいときは、私の場合は Helper 等 URL を生成する処理を全部自作しています。
かなりめんどくさいです・・・。MCITP(Database Developer/Database Administrator)
- 回答としてマーク 星 睦美 2014年6月9日 6:01
-
> 引数1つだと現在のconroller名が使用され、 _001_Testとなるのが正しいのですね。
では何故、開発サーバーでは test になったのでしょう? そこが問題なのですよね?
今一度確認しますが、問題は、ASP.NET 開発サーバー上で動かした時は、
> http//aaa.com/test/action/
>
> から
>
> return RedirectToAction("complete/");
>
> とすると
>
> http//aaa.com/test/complete/という希望通りの結果になるが、IIS6 上で動かした時は上記 URL の test の部分が _001_Test になるということですよね?
すべてが正しく設定されていれば、RedirectToAction の引数が 1 つか 2 つかは関係なくて、どちらでも同じ結果になるはずです。
なので、何故開発サーバーと IIS6 とが違う結果になるかの原因を究明して、必要に応じて対策を取らなければ真の問題解決にはならないのではないですか? (残念ながら、自分には環境がないのでそのお手伝いができませんが)
> 末尾の"/"の件も了解しました。
末尾のスラッシュ ( / ) の有無は、SEO に関わる問題があります。検索エンジンは、末尾にスラッシュがあるか無いかの違いがあるだけで、同じコンテンツを提供する 2 つの URL と解釈し、ランクを下げるそうです。
なので、SEO 対策を気にするのであれば、末尾にスラッシュを付けるか付けないかどちらかに決めて、それを守ることが重要だそうです。
ただ、URL を生成するために使われるヘルパーは末尾にスラッシュを付けない傾向にあるため、ASP.NET MVC では末尾にスラッシュを付けない方が一般的・・・と、マイクロソフト公式解説書の「プログラミング ASP.NET MVC」に書いてありました。
- 編集済み SurferOnWww 2014年6月5日 6:05 誤字訂正