none
ASP.NET MVC 5でのViews配下のフォルダ階層について RRS feed

  • 質問

  • お世話になっております。

    ASP.NET MVC 5でのViewsフォルダの中の階層についてなのですが、/Views/{カテゴリ}/{バージョン}/{ファイル名}.cshtml

    という感じにしたいのですが、{カテゴリ}のところをコントローラ名にして、その後の{バージョン}をどのようにしたら良いのかわからず困っています。

    {ファイル名}はアクションでいいんだろうと思うのですが、よくわかっておりません。

    こういうふうにするといいよというのがありましたらよろしくお願いします。

    2016年3月22日 17:23

回答

  • 例えば、Categoryコントローラーのアクションの中で、ビューとして /Views/Category/Version/Index.cshtml を指定したい場合は、次のようにできます。

    return View("Version/Index");
    または、
    return View("~/Views/Category/Version/Index.cshtml");

    (VisualStudio 2015 Professional Update1 + MVC5.2.3で確認しました)


    どちらの方法も、VisualStudioの「ビューに移動する」機能は利きません。
    変則的な使い方故、もしかしたら他にも問題があるかもしれませんのでご注意下さい。


    ご参考になれば幸いです。

    • 回答としてマーク LASIK005 2016年4月1日 11:26
    2016年3月24日 15:56
  • > 本を一読しただけなので理解しているかは怪しいのですが、そういった方法で
    > ルーティングをするのが基本というのは書いてあったので知っています。

    自分の手を動かして、簡単なアプリを作ってみるというようなことはやってみたでしょうか? もしまだなら、まずそれをやってみることをお勧めします。

    Visual Studio のテンプレート、スキャフォールディング機能などの Visual Studio のウィザードなど、基本・既定をベースにして作られています。

    例えば、以下は VS2010 の MVC4 インターネットアプリケーションのテンプレートで作ったプロジェクトのコントローラーとビューをソリューションエクスプローラーで見た画像ですが、既定のフォルダ構成で自動的にファイルを生成してくれます。

    また、例えば、コントローラーからビューを作成する場合、Visual Studio のウィザードを使えば、自動的に既定のフォルダを作って .cshtml ファイル(ビュー)を自動生成してくれます。

    あと、コントローラーのアクションメソッドで return View("<version>/<view名>"); のようにする場合 <version> には実際のバージョンを示す数字等を入れることを考えていると思いますが、それはいろいろ不都合があるので止めた方がいいと思います。

    不都合というのは、例えば、バージョンが変わるとアクションメソッドのコードを書き換えなければならない、アクションメソッドのコードを変更すると Visual Studio で再コンパイルして運用環境の .dll を差し替えなければならなくなるということです。(View だけの変更なら .cshtml ファイルのソースのみ差し替えれば済む)

    どうしてもと言うことがない限り、基本・既定から外れてわざわざ茨の道に進む必要ななさそうに思います。

    > 自分が管理しやすいのが上記のようなフォルダ構造なのです

    上に書きましたことから、管理しやすいということはまずないと思います。例え質問者さんが管理しやすくても、保守で管理するのは質問者さんとは別の人になるかもしれませんし(基本・既定から外れたことをすると保守する人に恨まれるかも)。

    > 自分がやりたいことと基本とが違うと思っているのは、基本では表示する内容がDB
    > にあり、それをリストで表示するということと思っているのですが、自分はそういう
    > 感じではなく.cshtmlファイルにメインの内容が静的に書いてあるものを表示したい
    > ということですので、基本と違うのだなという認識です。

    そこのところは全く関係ないです。どちらの場合でも基本・既定ベースで作ることに何の問題もないはずです。

    とにかく一度基本・既定ベースで作ってみてください。その上で、どうしても基本・既定から外れて茨の道に進む必要があるかどうか考えてみることをお勧めします。




    • 編集済み SurferOnWww 2016年3月26日 1:41 一部訂正
    • 回答としてマーク LASIK005 2016年4月1日 11:25
    2016年3月26日 1:30

すべての返信

  • > Viewsフォルダの中の階層についてなのですが、/Views/{カテゴリ}/{バージョン}/{ファイル名}.cshtml
    > という感じにしたいのですが

    ASP.NET MVC のルーティングに関する基本的な知識は持っていて、それを知った上で、上記のような基本・既定と違うことをやりたいということなんでしょうか?

    基本・既定は {controller}/{action}/{id} というようにコントローラーのアクションメソッドを要求するのですが(View を要求するのではなくて)、にもかかわらず上記のようにしたいということであれば、その理由も教えてください。理由が分かれば、上記のようにするのではなくて、こうした方が良いという代案も出てくるかもしれませんので。

    2016年3月23日 1:32
  • 例えば、Categoryコントローラーのアクションの中で、ビューとして /Views/Category/Version/Index.cshtml を指定したい場合は、次のようにできます。

    return View("Version/Index");
    または、
    return View("~/Views/Category/Version/Index.cshtml");

    (VisualStudio 2015 Professional Update1 + MVC5.2.3で確認しました)


    どちらの方法も、VisualStudioの「ビューに移動する」機能は利きません。
    変則的な使い方故、もしかしたら他にも問題があるかもしれませんのでご注意下さい。


    ご参考になれば幸いです。

    • 回答としてマーク LASIK005 2016年4月1日 11:26
    2016年3月24日 15:56
  • 回答ありがとうございます。

    そして返信が遅くなり申し訳ありません。

    なぜ{カテゴリ}/{バージョン}/{ファイル名}.cshtmlにしたいかというと、同じカテゴリのなかでバージョンが違うけどファイル名が同一になる可能性があります。その為自分が管理しやすいのが上記のようなフォルダ構造なのです。

    よろしくお願いします。

    2016年3月24日 17:17
  • 回答ありがとうございます。

    そういうやり方で出来るのですね。参考になります。

    実はまだ構想中なのですぐに取り掛かるというわけではないのですが、試してみたいと思います。

    ありがとうございます。

    2016年3月24日 17:18
  • 先の私のレスの質問、

    > ASP.NET MVC のルーティングに関する基本的な知識は持っていて、それを知った上で、
    > 上記のような基本・既定と違うことをやりたいということなんでしょうか?

    に対する答えはいかがでしょうか? 基本・既定と違うことをするのは、今後の保守等も含めて、管理しやすいということはないと思うのですが。

    2016年3月24日 17:38
  • 再度の投稿ありがとうございます。

    本を一読しただけなので理解しているかは怪しいのですが、そういった方法でルーティングをするのが基本というのは書いてあったので知っています。

    自分がやりたいことと基本とが違うと思っているのは、基本では表示する内容がDBにあり、それをリストで表示するということと思っているのですが、自分はそういう感じではなく.cshtmlファイルにメインの内容が静的に書いてあるものを表示したいということですので、基本と違うのだなという認識です。

    ASP.NETはWebフォームでやってきたのでそういう考え方になっているのかもしれません。

    もしなにかよい方法がありましたらよろしくお願いします。

    2016年3月25日 16:32
  • > 本を一読しただけなので理解しているかは怪しいのですが、そういった方法で
    > ルーティングをするのが基本というのは書いてあったので知っています。

    自分の手を動かして、簡単なアプリを作ってみるというようなことはやってみたでしょうか? もしまだなら、まずそれをやってみることをお勧めします。

    Visual Studio のテンプレート、スキャフォールディング機能などの Visual Studio のウィザードなど、基本・既定をベースにして作られています。

    例えば、以下は VS2010 の MVC4 インターネットアプリケーションのテンプレートで作ったプロジェクトのコントローラーとビューをソリューションエクスプローラーで見た画像ですが、既定のフォルダ構成で自動的にファイルを生成してくれます。

    また、例えば、コントローラーからビューを作成する場合、Visual Studio のウィザードを使えば、自動的に既定のフォルダを作って .cshtml ファイル(ビュー)を自動生成してくれます。

    あと、コントローラーのアクションメソッドで return View("<version>/<view名>"); のようにする場合 <version> には実際のバージョンを示す数字等を入れることを考えていると思いますが、それはいろいろ不都合があるので止めた方がいいと思います。

    不都合というのは、例えば、バージョンが変わるとアクションメソッドのコードを書き換えなければならない、アクションメソッドのコードを変更すると Visual Studio で再コンパイルして運用環境の .dll を差し替えなければならなくなるということです。(View だけの変更なら .cshtml ファイルのソースのみ差し替えれば済む)

    どうしてもと言うことがない限り、基本・既定から外れてわざわざ茨の道に進む必要ななさそうに思います。

    > 自分が管理しやすいのが上記のようなフォルダ構造なのです

    上に書きましたことから、管理しやすいということはまずないと思います。例え質問者さんが管理しやすくても、保守で管理するのは質問者さんとは別の人になるかもしれませんし(基本・既定から外れたことをすると保守する人に恨まれるかも)。

    > 自分がやりたいことと基本とが違うと思っているのは、基本では表示する内容がDB
    > にあり、それをリストで表示するということと思っているのですが、自分はそういう
    > 感じではなく.cshtmlファイルにメインの内容が静的に書いてあるものを表示したい
    > ということですので、基本と違うのだなという認識です。

    そこのところは全く関係ないです。どちらの場合でも基本・既定ベースで作ることに何の問題もないはずです。

    とにかく一度基本・既定ベースで作ってみてください。その上で、どうしても基本・既定から外れて茨の道に進む必要があるかどうか考えてみることをお勧めします。




    • 編集済み SurferOnWww 2016年3月26日 1:41 一部訂正
    • 回答としてマーク LASIK005 2016年4月1日 11:25
    2016年3月26日 1:30
  • 返信が遅くなってすみません。

    画像まで使っていただいて説明ありがとうございます。

    力説していただいたということはかなりの茨になるということなのだと理解しました。

    再考してうまい方法がないか考えてみたいと思います。

    ありがとうございました。

    2016年4月1日 11:25
  • > 力説していただいたということはかなりの茨になるということなのだと理解しました。

    「力説」と追う表現に非常に引っかかるものを感じるんですが、どういう意味ですか?

    2016年4月1日 13:36
  • 私が考えている方法・やり方では、後々茨の道になり大変だよということを解説していただいたということです。

    私が色々なQAサイトを見ていると、割りと質問者さんの要望に沿った回答が多いかと思いますが、そっちのやり方はダメだと言うとしてもあっさりとした感じかな思っております。

    ですので画像まで使っていただいての回答でしたのでついそういう表現を使ってしまいました。

    お気に障りましたらすみません。

    親身になって教えてくださりありがとうございます。

    2016年4月2日 7:39
  • > 私が考えている方法・やり方では、後々茨の道になり大変だよということを解説していただいたということです。

    誤解していないでしょうか?

    私の言っていることを要約すると、上の私のレスの最後に書いてある、"とにかく一度基本・既定ベースで作ってみてください。その上で、どうしても基本・既定から外れて茨の道に進む必要があるかどうか考えてみることをお勧めします。" です。

    あなたの言う、

    > 私が色々なQAサイトを見ていると、割りと質問者さんの要望に沿った回答が多いかと思いますが、

    というのがどこのサイトか知りませんが、このフォーラムは技術者同士の情報交換の場所(以下の案内参照)ということで、質問者さん専用の Q&A の場所ではありません。

    フォーラムでご質問頂くにあたっての注意点
    https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68

    なので、今回に限らず、もし質問者さんの要望に疑問があれば自分は指摘させていただいています。(今回の自分の疑問は基本・既定ベースで作った上でそういう要望を出しているのかです)

    なので、そういうことを言う前に「とにかく一度基本・既定ベースで作ってみて」、その上であなたの要望が基本・既定から外れてもやるべき価値があると判断された理由を説明いただければと思います。

    そうしていただけていたら、私以外の回答者の方からも、「割りと質問者さんの要望に沿った回答」が出やすかったのではないかと思います。

    2016年4月2日 9:21
  • 再度の返信ありがとうございます。

    もう一度基本に立ち返り、考えてみようと思います。

    恐らく私が勘違いしている点もあるかと思います。

    ありがとうございました。

    2016年4月5日 7:52