Razor _layout.cshtmlにファイル名の先頭にアンダースコアがあるのはなぜですか?


144

デフォルトのASP.NET MVC 3プロジェクトでは、レイアウトと一部のcshtmlファイルはアンダースコアで始まります

  • _viewstart
  • _Layout
  • _LogOnPartial

なぜこの規則、そしてこれは何のために使われるのですか?この規則に従う必要がありますか?

フレームワーク.cshtmlは、アンダースコアで始まるファイルに特別な意味を与えますか?


私はNancyFXをRazorで使用します。デフォルトでは、Contentフォルダーにないすべてのコンテンツが制限されるためです。(これはweb.configまたはカスタム設定でオーバーライドできます).cshtmlなどのファイルを直接提供することは不可能です。したがって、ビュー名の前に "_"を付けないでください。これは、必要がなく、見苦しいためです。
Norbert Norbertson 2016年

回答:


205

RazorはASP.NET Webページ(WebMatrix)用に開発されました。これには、MVC内で取得するビューフォルダーとルーティングに関して、同じ種類の保護が組み込まれていません。Webページのレイアウトページは直接提供されることを意図していないため、アンダースコアが前に付けられます。また、Webページフレームワークは、名前に先頭にアンダースコアが付いているファイルが直接要求されないように構成されています。Webページ内の他の.cshtmlファイルは、通常、参照可能である必要があります。これらは、.aspファイルまたは.phpファイルに相当します。

ASP.NETチームは、WebページはASP.NET開発の出発点であり、(先に進みたい人のために)MVCへの移行につながるはずであると述べています。その一部は、WebページからMVCへの移行が可能な限り簡単であることを意味します。したがって、Webページ内で確立された命名規則をMVC Razorファイルに引き継ぐことは理にかなっています。

だから、そこにあるアンダースコアを使用してファイル名を前に置くための技術的な理由は-それだけでMVCには関係ありません。

[2018年10月更新]

新しいASP.NET Core Razorページフレームワーク(バージョン2.1を除く)では、起動時にルートが生成されると、@pageディレクティブがある場合でも(通常はルーティング可能なRazorページになります)、ルートが生成されると無視されます。 。そのため、Razor Pagesアプリケーションでレイアウトや部分ファイルを先頭にアンダースコアを付けて参照することを意図していない場合は、それらに名前を付けるのが理にかなっています。


6
ありがとう。私にとってこれは最も洞察に満ちた答えです。私は、RazorがMVCに関連付けられているという誤解の下にありました。現在、主なアンダースコアの理由は、ASP.NET Webページで直接提供されないようにするためです。
richb

1
実際に機能が関連付けられている命名規則は、MSの方がよくわかると思いました。そして今、それは白紙のはずのMVCに持ち越されました。
Boris B.

「One ASP.NET」機能を含む現在の.NET Framework 4.5.1とVisual Studio 2013のリリース後、これらの技術的な制限/ハードコーディングから最終的に移行できることを願っています。もちろん、現在の* .config、APP_Code、およびAPP_Dataディレクトリと同様に、共有されない標準ファイルを持つことは不可欠です。ただし、このロジックは、どこか(デフォルトではmachine config)の構成ファイルに配置して、上書きできるようにする必要があります。また、これらの共通ページのデフォルト名は構成可能でなければなりません(レイアウト/エラー/その他...)。
トニーウォール

1
@ダニエルああ、私はあなたが何を意味するのかわかります。広告どおりに機能しないため、回答を編集しました。
Mike Brind 2018年

1
@Daniel表示されているのは、Razor Pages 2.1で明らかになったバグです。2.2で修正される予定です。2.0で説明したように動作します。
マイクブリンド

12

それがRuby on Railsのやり方です(Partialsは_で始まりますが、Render Partial呼び出しには_が含まれていません)。ASP.netMVCはそこから大きなインスピレーションを得ています。

実際には技術的な理由はありません。他の開発者(および6か月後の自分)に意図を明確に示すための慣例にすぎません。これは部分的なビューです。


上記の回答で指摘されているように、これは正しくありません。アンダースコアにはセキュリティ機能があります。
iJungleBoy 2017

1
@iJungleBoy受け入れられた回答を参照してください。ASP.net MVC(この質問について)の場合、セキュリティ機能はありません。すべてのcshtmlファイルとaspxファイルを、アンダースコアかどうかに関係なく(System.Web.HttpNotFoundHandlerそれらのために設定されています)、Viewsフォルダーのweb.configを参照してください。
Michael Stum

7

ブラウザからの直接のリクエストでは表示できないページ(マスターページ、部分ビューなど)の名前の先頭にはアンダースコア(_)が付いています。

したがって、_Layout.cshtml(これはマスターページです)にリクエストを送信しようとすると、サーバーからエラーが発生します。

Razorビューエンジンで、スタンドアロンページとして参照できないファイルを区別する方法。

このように考えてみてください... MVC 2では...部分ビューとマスターサイトを区別し、接尾辞.master、.ascx、通常のページは.aspxですが、Razorビューでは...すべてのビューは.cshtmlであるため、部分ページとマスターページを区別するために、プレフィックス(_)が付きます。必須ではなく、単なる「慣例」です。


4
しかし、そのロジックによって、すべてのcs&cshtmlファイルの先頭にアンダースコアが付けられるのではないでしょうか?
richb '01年

すべてのファイルにプレフィックスとして_が付いている場合、サイトは機能しません... _prefixが付いているファイルは通常のページ内にレンダリングされます...(パーシャルの場合)、サイトマスターはテンプレートです...表示されます。
Juztin、2011年

だから私はこれを試してみました、そして私の箱のIISはViewsディレクトリからのファイルを提供しません。静的な.htmlファイルでもありません。だから私はこれが答えだとは本当に思っていません。
richb '01年

ジュズティン:問題は、なぜアンダースコアで始まるのですか?_Layout.cshtmの名前をLayout.cshtmlに変更しても、問題なく機能します。それでは、この条約の理由は何ですか?
richb

2
問題は、ウェブページではなくasp.net mvcに関するものです
fabspro

2

私の知る限り、これは単にファイルの意図を識別するために使用される規則です。実際にファイルの動作が変わるとは思いません。ほとんどの開発コンテキストでは、アンダースコアを前に付けることで、クラスまたはこの場合は別のテンプレートのいずれかにかかわらず、「プライベート」で使用するためのものを識別します。


1

私はMVCを使用していませんが、かみそりの構文を使用するWebページでは、_プレフィックスは一般に、ページがユーザーによってアクセスされるのではなく、他のページまたはコードによってアクセスされることを意図していないことを簡略化します。_prefixを含むページに移動しようとすると、asp.netはそのページへのアクセスを妨げます。ユーザーが直接アクセスしてはならないレイアウトページやその他のページで使用されるのはこのためです。

asp.netのApp_Codeフォルダーのようなもの


@MikeBrindすることはできません「ナビゲート」へ/ブラウズ直接任意の下のビューの/viewデフォルトのASP.NET MVCプロジェクトでは、/views/web.configファイルは、それを防ぐために設定されています。ただし、コントローラーアクションが返されないようにするものは何もありませんView("_Index", model);。上記のように、ビューの名前を_Index.cshtmlに変更し、呼び出すアクションを変更するだけでそれを実行しました。
Andrew Barber、

@MikeBrindこの質問はWebページではなくMVCに関するものです。確かに 私は元のコメントでそれを指定しませんでした。
Andrew Barber、

@MikeBrind私は-そして - この答えに答えています。あなたのものではない。私の最初のコメントは誤解を招くものでした(ただし、「部分」についても言及しました)ので、それを削除しました。私のポイントは、アンダースコアがMVCでビューを読み込めないこととは何の関係もないということでした。このユーザーは「私はMVCを使用しません」とさえ言い始めましたが、この質問はMVCに関するものでした。私が後でこの答えを読んでいる誰かがMVCでは下線がビューをロードするコントローラーアクションの機能に何らかの影響を与えるとは思わないことを確認しています。大きな問題ではない。私は私が話す方法に不慣れだったことに同意します。できました。
Andrew Barber、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.