none
MVCのRedirectToActionについて RRS feed

  • 質問

  • お世話になります。

    MVC3で開発を行っておりまして、

    RedirectToActionで画面遷移を行うと

    VisualStudioでデバッグ実行したときは問題がないのですが

    IIS上で実装するとコントローラ名がURLに表示されてしまう現象が発生しております。

    return RedirectToAction("complete/");

    と記述すると

    URLが"_001_Test/complete/"

    と表示されます。

    VisualStudioでデバッグ実行したときは

    URLが"/test/complete"

    となっています。

    情報が不足しているかもしれませんが

    何か原因がわかりそうであればご教授いただければと思います。

    環境:Win2003、IIS6、framewrok4

    よろしくお願いいたします。

    2014年6月3日 9:47

回答

  • 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
    2014年6月4日 8:38

すべての返信

  • _001_Test とか test とは何ですか? アプリケーション名ですか?

    開発環境では、ASP.NET 開発サーバー、IIS Express、IIS のどれを使っているのでしょう? IIS または IIS Express の場合は Web タブで [プロジェクトの URL(J)] の設定はどうなっているのでしょう?

    運用環境では IIS の設定でアプリケーションのエイリアスは何になっているのでしょう?

    2014年6月3日 11:48
  • 説明不足ですみません。

    「_001_Test 」はコントローラ名です。

    「test 」はURLです。

    http//aaa.com/test/action/

    から

    return RedirectToAction("complete/");

    とすると

    http//aaa.com/test/complete/

    になってほしいのですが。

    開発環境では、ASP.NET 開発サーバーを使用しております。

    運用環境では IIS の設定は

    仮想ディレクトリではなくホームディレクトリを設定しています。

    質問の回答になっていますでしょうか?

    よろしくお願いいたします。

    2014年6月3日 12:35
  • > 質問の回答になっていますでしょうか?

    スミマセンがよくわかりません。

    どのぐらい ASP.NET Web Forms / MVC での開発経験がおありでしょうか? それをお聞きしてどう答えたら良いか考えます。

    2014年6月3日 12:51
  • すみません。

    MVCは始めたばかりです。

    Global.asax で

    下記のように書いています。

        routes.MapRoute(
            "test", // ルート名
            "{controller}/{action}/{id}", // パラメーター付きの URL
            new { controller = "_001_Test ", action = "Index", id = UrlParameter.Optional } // パラメーターの既定値
        );

     

    2014年6月3日 13:01
  • > 環境: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 誤字訂正
    2014年6月4日 1:39
  • IIS6の設定ですが、

    ネットで調べて

    ハンドラマッピング>ワイルドカードスクリプトマップの追加>apsnet_isapi.dll

    を設定しております。

    他の画面は問題なく動作していて、

    ある特定の画面のRedirectToActionのみ

    動作がおかしくなってしまっていて、今回質問をさせて頂きました。

    2014年6月4日 2:06
  • サーバーが IIS6 で、かつ、

    > ハンドラマッピング>ワイルドカードスクリプトマップの追加>apsnet_isapi.dll

    という質問者さんの独自設定(?)があるとすると原因はその辺りに間違いなさそうですが、どういう設定をしたのかわかりませんし問題の再現もできませんので、自分には原因究明は無理そうです。

    せいぜい言えるのは、対症療法ですが、どうしても RedirectToAction メソッドを使う必要がなければ、それに代えて Redirect メソッドを試してみてははいかがと言うことぐらいです。

    Redirect メソッドは指定された URL に直接 Response.Redirect を使ってリダイレクトするということなので、質問者さん独自設定(?)による影響を回避できるかもしれません。

    ブラウザのアドレスバーに http//aaa.com/test/complete/ と入力して目的のページ取得して表示できるなら、

    return Redirect("~/test/complete/");

    として試してみてください。

    2014年6月4日 3:44
  • RedirectToAction での原因が不明ですが

    return Redirectで回避できました。

    2014年6月4日 7:18
  • 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
    2014年6月4日 8:38
  • ご回答ありがとうございます。

    引数1つだと現在のconroller名が使用され、 _001_Testとなるのが正しいのですね。

    同じような記述をしていて他の画面ではconroller名がURLに表示されることはなかったのが不思議でした。

    末尾の"/"の件も了解しました。自作は厳しいですね。

    2014年6月5日 2:21
  • > 引数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 誤字訂正
    2014年6月5日 6:02