ASP.NET Core の Razor 構文リファレンスRazor syntax reference for ASP.NET Core

作成者: Rick AndersonLuke LathamTaylor MullenDan VicarelBy Rick Anderson, Luke Latham, Taylor Mullen, and Dan Vicarel

Razor は、Web ページにサーバー ベースのコードを埋め込むためのマークアップ構文です。Razor is a markup syntax for embedding server-based code into webpages. Razor 構文は、Razor マークアップ、C#、HTML で構成されます。The Razor syntax consists of Razor markup, C#, and HTML. 通常、Razor を含むファイルのファイル拡張子は .cshtml です。Files containing Razor generally have a .cshtml file extension.

HTML のレンダリングRendering HTML

Razor の既定の言語は HTML です。The default Razor language is HTML. Razor マークアップからの HTML のレンダリングは、HTML ファイルからの HTML のレンダリングと同じです。Rendering HTML from Razor markup is no different than rendering HTML from an HTML file. .cshtml Razor ファイル内の HTML マークアップは、サーバーによって変更されずにレンダリングされます。HTML markup in .cshtml Razor files is rendered by the server unchanged.

Razor の構文Razor syntax

Razor は C# をサポートし、@ 記号を使って HTML から C# に移行します。Razor supports C# and uses the @ symbol to transition from HTML to C#. Razor は C# の式を評価し、それらを HTML の出力でレンダリングします。Razor evaluates C# expressions and renders them in the HTML output.

@ 記号の後に Razor の予約済みキーワードが続いている場合は、Razor 固有のマークアップに移行します。When an @ symbol is followed by a Razor reserved keyword, it transitions into Razor-specific markup. それ以外の場合は、普通の C# に移行します。Otherwise, it transitions into plain C#.

Razor マークアップで @ 記号をエスケープするには、@ 記号をもう 1 つ使います。To escape an @ symbol in Razor markup, use a second @ symbol:

<p>@@Username</p>

HTML では、コードは 1 つの @ 記号でレンダリングされます。The code is rendered in HTML with a single @ symbol:

<p>@Username</p>

メール アドレスを含む HTML の属性とコンテンツは、@ 記号を遷移文字として扱いません。HTML attributes and content containing email addresses don't treat the @ symbol as a transition character. 次の例のメール アドレスは、Razor の解析ではそのまま残ります。The email addresses in the following example are untouched by Razor parsing:

<a href="mailto:Support@contoso.com">Support@contoso.com</a>

暗黙的な Razor 式Implicit Razor expressions

Razor の暗黙的な式は、@ で始まって C# のコードが続きます。Implicit Razor expressions start with @ followed by C# code:

<p>@DateTime.Now</p>
<p>@DateTime.IsLeapYear(2016)</p>

C# の await キーワードを除き、暗黙的な式にスペースを含めることはできません。With the exception of the C# await keyword, implicit expressions must not contain spaces. C# のステートメントに明確な終わりがある場合は、スペースを混在させることができます。If the C# statement has a clear ending, spaces can be intermingled:

<p>@await DoSomething("hello", "world")</p>

暗黙的な式では、山かっこ (<>) の内側の文字は HTML タグとして解釈されるため、C# ジェネリックを含めることはできませんImplicit expressions cannot contain C# generics, as the characters inside the brackets (<>) are interpreted as an HTML tag. 次のコードは有効ではありませんThe following code is not valid:

<p>@GenericMethod<int>()</p>

上記のコードでは、次のいずれかのようなコンパイラ エラーが生成されます。The preceding code generates a compiler error similar to one of the following:

  • The "int" element wasn't closed.The "int" element wasn't closed. All elements must be either self-closing or have a matching end tag. ("int" 要素が閉じられませんでした。すべての要素は、自己終了するか、対応する終了タグが存在する必要があります。)All elements must be either self-closing or have a matching end tag.
  • メソッド グループ 'GenericMethod' を非デリゲート型 'object' に変換することはできません。Cannot convert method group 'GenericMethod' to non-delegate type 'object'. このメソッドを呼び出しますか?Did you intend to invoke the method?`

ジェネリック メソッドの呼び出しは、明示的な Razor 式または Razor コード ブロックにラップする必要があります。Generic method calls must be wrapped in an explicit Razor expression or a Razor code block.

明示的な Razor 式Explicit Razor expressions

明示的な Razor 式は、@ 記号とバランスの取れたかっこ記号で構成されます。Explicit Razor expressions consist of an @ symbol with balanced parenthesis. 1 週間前の時刻を表示するには、次の Razor マークアップを使います。To render last week's time, the following Razor markup is used:

<p>Last week this time: @(DateTime.Now - TimeSpan.FromDays(7))</p>

@() のかっこ内の内容が評価されて、出力にレンダリングされます。Any content within the @() parenthesis is evaluated and rendered to the output.

前のセクションで説明した暗黙的な式は、一般に、スペースを含むことはできません。Implicit expressions, described in the previous section, generally can't contain spaces. 次のコードでは、現在時刻から 1 週間は減算されません。In the following code, one week isn't subtracted from the current time:

<p>Last week: @DateTime.Now - TimeSpan.FromDays(7)</p>

このコードでは、次のような HTML がレンダリングされます。The code renders the following HTML:

<p>Last week: 7/7/2016 4:39:52 PM - TimeSpan.FromDays(7)</p>

明示的な式を使うと、テキストと式の結果を連結できます。Explicit expressions can be used to concatenate text with an expression result:

@{
    var joe = new Person("Joe", 33);
}

<p>Age@(joe.Age)</p>

明示的な式を使わないと、<p>Age@joe.Age</p> はメール アドレスとして扱われ、<p>Age@joe.Age</p> がレンダリングされます。Without the explicit expression, <p>Age@joe.Age</p> is treated as an email address, and <p>Age@joe.Age</p> is rendered. 明示的な式として記述すると、<p>Age33</p> がレンダリングされます。When written as an explicit expression, <p>Age33</p> is rendered.

明示的な式を使うと、ジェネリック メソッドから .cshtml ファイルに出力できます。Explicit expressions can be used to render output from generic methods in .cshtml files. 次のマークアップは、C# ジェネリックの山かっこによって発生した前述のエラーを修正する方法について示します。The following markup shows how to correct the error shown earlier caused by the brackets of a C# generic. コードは明示的な式として書き込まれます。The code is written as an explicit expression:

<p>@(GenericMethod<int>())</p>

式のエンコードExpression encoding

文字列として評価される C# の式は、HTML でエンコードされます。C# expressions that evaluate to a string are HTML encoded. IHtmlContent として評価される C# の式は、IHtmlContent.WriteTo によって直接レンダリングされます。C# expressions that evaluate to IHtmlContent are rendered directly through IHtmlContent.WriteTo. IHtmlContent として評価されない C# の式は、ToString によって文字列に変換され、レンダリングされる前にエンコードされます。C# expressions that don't evaluate to IHtmlContent are converted to a string by ToString and encoded before they're rendered.

@("<span>Hello World</span>")

このコードでは、次のような HTML がレンダリングされます。The code renders the following HTML:

&lt;span&gt;Hello World&lt;/span&gt;

HTML はブラウザーで次のように表示されます。The HTML is shown in the browser as:

<span>Hello World</span>

HtmlHelper.Raw の出力はエンコードされませんが、HTML マークアップとしてレンダリングされません。HtmlHelper.Raw output isn't encoded but rendered as HTML markup.

警告

サニタイズされていないユーザー入力で HtmlHelper.Raw を使うと、セキュリティ上のリスクがあります。Using HtmlHelper.Raw on unsanitized user input is a security risk. ユーザー入力には、悪意のある JavaScript または他の攻撃が含まれる可能性があります。User input might contain malicious JavaScript or other exploits. ユーザー入力をサニタイズすることは困難です。Sanitizing user input is difficult. ユーザー入力では HtmlHelper.Raw を使わないでください。Avoid using HtmlHelper.Raw with user input.

@Html.Raw("<span>Hello World</span>")

このコードでは、次のような HTML がレンダリングされます。The code renders the following HTML:

<span>Hello World</span>

Razor コード ブロックRazor code blocks

Razor コード ブロックは、@ で始まり、{} で囲まれています。Razor code blocks start with @ and are enclosed by {}. 式とは異なり、コード ブロック内の C# コードはレンダリングされません。Unlike expressions, C# code inside code blocks isn't rendered. ビュー内のコード ブロックと式は同じスコープを共有し、次の順序で定義されます。Code blocks and expressions in a view share the same scope and are defined in order:

@{
    var quote = "The future depends on what you do today. - Mahatma Gandhi";
}

<p>@quote</p>

@{
    quote = "Hate cannot drive out hate, only love can do that. - Martin Luther King, Jr.";
}

<p>@quote</p>

このコードでは、次のような HTML がレンダリングされます。The code renders the following HTML:

<p>The future depends on what you do today. - Mahatma Gandhi</p>
<p>Hate cannot drive out hate, only love can do that. - Martin Luther King, Jr.</p>

暗黙の移行Implicit transitions

コード ブロック内の既定の言語は C# ですが、Razor ページは HTML に移行して戻ることがあります。The default language in a code block is C#, but the Razor Page can transition back to HTML:

@{
    var inCSharp = true;
    <p>Now in HTML, was in C# @inCSharp</p>
}

明示的に区切られた遷移Explicit delimited transition

HTML をレンダリングする必要のあるコード ブロックのサブセクションを定義するには、レンダリングする文字を Razor の <text> タグで囲みます。To define a subsection of a code block that should render HTML, surround the characters for rendering with the Razor <text> tag:

@for (var i = 0; i < people.Length; i++)
{
    var person = people[i];
    <text>Name: @person.Name</text>
}

HTML タグによって囲まれていない HTML をレンダリングするには、この方法を使います。Use this approach to render HTML that isn't surrounded by an HTML tag. HTML タグまたは Razor タグがない場合、Razor ラインタイム エラーが発生します。Without an HTML or Razor tag, a Razor runtime error occurs.

<text> タグは、内容をレンダリングするときに空白文字を制御するのに便利です。The <text> tag is useful to control whitespace when rendering content:

  • <text> タグの間の内容だけがレンダリングされます。Only the content between the <text> tag is rendered.
  • <text> タグの前後にある空白文字は HTML の出力には表示されません。No whitespace before or after the <text> tag appears in the HTML output.

@: による明示的な行の遷移Explicit Line Transition with @:

残りの行全体をコード ブロック内に HTML としてレンダリングするには、@: 構文を使います。To render the rest of an entire line as HTML inside a code block, use the @: syntax:

@for (var i = 0; i < people.Length; i++)
{
    var person = people[i];
    @:Name: @person.Name
}

コードに @: がないと、Razor ランタイム エラーが生成されます。Without the @: in the code, a Razor runtime error is generated.

警告: Razor ファイルに余分な @ 文字があると、ブロックの後続のステートメントでコンパイラ エラーが発生することがあります。Warning: Extra @ characters in a Razor file can cause compiler errors at statements later in the block. これらのコンパイラ エラーは、実際のエラーは報告されたエラーより前で発生しているため、理解するのが難しい場合があります。These compiler errors can be difficult to understand because the actual error occurs before the reported error. このエラーは、複数の暗黙的/明示的な式を 1 つのコード ブロックに結合した後で発生することがよくあります。This error is common after combining multiple implicit/explicit expressions into a single code block.

制御構造Control structures

制御構造は、コード ブロックの拡張機能です。Control structures are an extension of code blocks. コード ブロックのすべての側面 (マークアップへの遷移、インライン C# ) が、次の構造にも適用されます。All aspects of code blocks (transitioning to markup, inline C#) also apply to the following structures:

条件付き @if、else if、else、@switchConditionals @if, else if, else, and @switch

@if は、いつコードを実行するかを制御します。@if controls when code runs:

@if (value % 2 == 0)
{
    <p>The value was even.</p>
}

else および else if には、@ 記号は必要ありません。else and else if don't require the @ symbol:

@if (value % 2 == 0)
{
    <p>The value was even.</p>
}
else if (value >= 1337)
{
    <p>The value is large.</p>
}
else
{
    <p>The value is odd and small.</p>
}

次のマークアップでは、switch ステートメントの使い方を示します。The following markup shows how to use a switch statement:

@switch (value)
{
    case 1:
        <p>The value is 1!</p>
        break;
    case 1337:
        <p>Your number is 1337!</p>
        break;
    default:
        <p>Your number wasn't 1 or 1337.</p>
        break;
}

@for、@foreach、@while、@do while のループLooping @for, @foreach, @while, and @do while

ループ制御ステートメントを使って、テンプレート化された HTML をレンダリングできます。Templated HTML can be rendered with looping control statements. 人の一覧をレンダリングするには:To render a list of people:

@{
    var people = new Person[]
    {
          new Person("Weston", 33),
          new Person("Johnathon", 41),
          ...
    };
}

以下のループ ステートメントがサポートされています。The following looping statements are supported:

@for

@for (var i = 0; i < people.Length; i++)
{
    var person = people[i];
    <p>Name: @person.Name</p>
    <p>Age: @person.Age</p>
}

@foreach

@foreach (var person in people)
{
    <p>Name: @person.Name</p>
    <p>Age: @person.Age</p>
}

@while

@{ var i = 0; }
@while (i < people.Length)
{
    var person = people[i];
    <p>Name: @person.Name</p>
    <p>Age: @person.Age</p>

    i++;
}

@do while

@{ var i = 0; }
@do
{
    var person = people[i];
    <p>Name: @person.Name</p>
    <p>Age: @person.Age</p>

    i++;
} while (i < people.Length);

複合 @usingCompound @using

C# では、オブジェクトを確実に破棄するために using オブジェクトが使われています。In C#, a using statement is used to ensure an object is disposed. Razor では、同じメカニズムが、追加コンテンツを含む HTML ヘルパーを作成するために使われています。In Razor, the same mechanism is used to create HTML Helpers that contain additional content. 次のコードの HTML ヘルパーは、@using ステートメントを含むフォーム タグをレンダリングします。In the following code, HTML Helpers render a form tag with the @using statement:

@using (Html.BeginForm())
{
    <div>
        email:
        <input type="email" id="Email" value="">
        <button>Register</button>
    </div>
}

スコープ レベルのアクションは、タグ ヘルパーを使って実行できます。Scope-level actions can be performed with Tag Helpers.

@try、catch、finally@try, catch, finally

例外処理は C# に似ています。Exception handling is similar to C#:

@try
{
    throw new InvalidOperationException("You did something invalid.");
}
catch (Exception ex)
{
    <p>The exception message: @ex.Message</p>
}
finally
{
    <p>The finally statement.</p>
}

@lock

Razor には、重要なセクションを lock ステートメントで保護する機能があります。Razor has the capability to protect critical sections with lock statements:

@lock (SomeLock)
{
    // Do critical section work
}

コメントComments

Razor は、C# と HTML のコメントをサポートしています。Razor supports C# and HTML comments:

@{
    /* C# comment */
    // Another C# comment
}
<!-- HTML comment -->

このコードでは、次のような HTML がレンダリングされます。The code renders the following HTML:

<!-- HTML comment -->

Razor のコメントは、Web ページがレンダリングされる前に、サーバーによって削除されます。Razor comments are removed by the server before the webpage is rendered. Razor では、@* *@ を使ってコメントを区切ります。Razor uses @* *@ to delimit comments. 次のコードはコメント化されているため、サーバーはどのマークアップもレンダリングしません。The following code is commented out, so the server doesn't render any markup:

@*
    @{
        /* C# comment */
        // Another C# comment
    }
    <!-- HTML comment -->
*@

ディレクティブDirectives

Razor のディレクティブは、@ 記号の後の予約キーワードによる暗黙的な式で表されます。Razor directives are represented by implicit expressions with reserved keywords following the @ symbol. 通常、ディレクティブは、ビューの解析方法を変更したり、異なる機能を有効にしたりします。A directive typically changes the way a view is parsed or enables different functionality.

Razor がビューのコードを生成する方法を理解すると、ディレクティブの動作を理解しやすくなります。Understanding how Razor generates code for a view makes it easier to understand how directives work.

@{
    var quote = "Getting old ain't for wimps! - Anonymous";
}

<div>Quote of the Day: @quote</div>

上のコードでは、次のようなクラスが生成されます。The code generates a class similar to the following:

public class _Views_Something_cshtml : RazorPage<dynamic>
{
    public override async Task ExecuteAsync()
    {
        var output = "Getting old ain't for wimps! - Anonymous";

        WriteLiteral("/r/n<div>Quote of the Day: ");
        Write(output);
        WriteLiteral("</div>");
    }
}

後の「ビューに対して生成された Razor C# クラスを調べる」セクションでは、この生成されたクラスを表示する方法について説明します。Later in this article, the section Inspect the Razor C# class generated for a view explains how to view this generated class.

@using

@using ディレクティブは、生成されるビューに C# の using ディレクティブを追加します。The @using directive adds the C# using directive to the generated view:

@using System.IO
@{
    var dir = Directory.GetCurrentDirectory();
}
<p>@dir</p>

@model

@model ディレクティブは、ビューに渡されるモデルの型を指定します。The @model directive specifies the type of the model passed to a view:

@model TypeNameOfModel

個々のユーザー アカウントで作成される ASP.NET Core MVC アプリの Views/Account/Login.cshtml ビューには、次のモデル宣言が含まれます。In an ASP.NET Core MVC app created with individual user accounts, the Views/Account/Login.cshtml view contains the following model declaration:

@model LoginViewModel

生成されるクラスは、RazorPage<dynamic> を継承します。The class generated inherits from RazorPage<dynamic>:

public class _Views_Account_Login_cshtml : RazorPage<LoginViewModel>

Razor では、ビューに渡されるモデルにアクセスするための Model プロパティが公開されています。Razor exposes a Model property for accessing the model passed to the view:

<div>The Login Email: @Model.Email</div>

@model ディレクティブは、このプロパティの型を指定します。The @model directive specifies the type of this property. ディレクティブでは、ビューが派生する生成されたクラスの TRazorPage<T> で指定します。The directive specifies the T in RazorPage<T> that the generated class that the view derives from. @model ディレクティブが指定されていない場合、Model プロパティは dynamic 型になります。If the @model directive isn't specified, the Model property is of type dynamic. モデルの値は、コントローラーからビューに渡されます。The value of the model is passed from the controller to the view. 詳細については、「厳密に型指定されたモデルと @model キーワード」を参照してください。For more information, see Strongly typed models and the @model keyword.

@inherits

@inherits ディレクティブは、ビューが継承するクラスの完全な制御を提供します。The @inherits directive provides full control of the class the view inherits:

@inherits TypeNameOfClassToInheritFrom

次のコードは、カスタム Razor ページ型です。The following code is a custom Razor page type:

using Microsoft.AspNetCore.Mvc.Razor;

public abstract class CustomRazorPage<TModel> : RazorPage<TModel>
{
    public string CustomText { get; } = "Gardyloo! - A Scottish warning yelled from a window before dumping a slop bucket on the street below.";
}

CustomText がビューに表示されます。The CustomText is displayed in a view:

@inherits CustomRazorPage<TModel>

<div>Custom text: @CustomText</div>

このコードでは、次のような HTML がレンダリングされます。The code renders the following HTML:

<div>Custom text: Gardyloo! - A Scottish warning yelled from a window before dumping a slop bucket on the street below.</div>

@model@inherits は同じビューで使うことができます。@model and @inherits can be used in the same view. @inherits は、ビューがインポートする _ViewImports.cshtml ファイルで指定できます。@inherits can be in a _ViewImports.cshtml file that the view imports:

@inherits CustomRazorPage<TModel>

次のコードは、厳密に型指定されたビューの例です。The following code is an example of a strongly-typed view:

@inherits CustomRazorPage<TModel>

<div>The Login Email: @Model.Email</div>
<div>Custom text: @CustomText</div>

モデルに rick@contoso.com が渡された場合、ビューは次の HTML マークアップを生成します。If "rick@contoso.com" is passed in the model, the view generates the following HTML markup:

<div>The Login Email: rick@contoso.com</div>
<div>Custom text: Gardyloo! - A Scottish warning yelled from a window before dumping a slop bucket on the street below.</div>

@inject

@inject ディレクティブを使うと、Razor ページでサービス コンテナーからビューにサービスを挿入できます。The @inject directive enables the Razor Page to inject a service from the service container into a view. 詳しくは、「ビューへの依存関係の挿入」をご覧ください。For more information, see Dependency injection into views.

@functions

@functions ディレクティブを使うと、Razor ページで C# コード ブロックをビューに追加できます。The @functions directive enables a Razor Page to add a C# code block to a view:

@functions { // C# Code }

例:For example:

@functions {
    public string GetHello()
    {
        return "Hello";
    }
}

<div>From method: @GetHello()</div> 

このコードは、次の HTML マークアップを生成します。The code generates the following HTML markup:

<div>From method: Hello</div>

次のコードは、生成された Razor C# クラスです。The following code is the generated Razor C# class:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Razor;

public class _Views_Home_Test_cshtml : RazorPage<dynamic>
{
    // Functions placed between here 
    public string GetHello()
    {
        return "Hello";
    }
    // And here.
#pragma warning disable 1998
    public override async Task ExecuteAsync()
    {
        WriteLiteral("\r\n<div>From method: ");
        Write(GetHello());
        WriteLiteral("</div>\r\n");
    }
#pragma warning restore 1998

@section

@section ディレクティブをレイアウトと組み合わせて使うと、HTML ページのさまざまな部分のコンテンツをビューでレンダリングできます。The @section directive is used in conjunction with the layout to enable views to render content in different parts of the HTML page. 詳しくは、「セクション」をご覧ください。For more information, see Sections.

タグ ヘルパーTag Helpers

タグ ヘルパーに関する 3 つのディレクティブがあります。There are three directives that pertain to Tag Helpers.

ディレクティブDirective 関数Function
@addTagHelper@addTagHelper ビューでタグ ヘルパーを使えるようにします。Makes Tag Helpers available to a view.
@removeTagHelper@removeTagHelper 前に追加したタグ ヘルパーをビューから削除します。Removes Tag Helpers previously added from a view.
@tagHelperPrefix@tagHelperPrefix タグ プレフィックスを指定して、タグ ヘルパーのサポートを有効にしたり、タグ ヘルパーの使用を明示的にしたりします。Specifies a tag prefix to enable Tag Helper support and to make Tag Helper usage explicit.

Razor の予約済みキーワードRazor reserved keywords

Razor のキーワードRazor keywords

  • page (ASP.NET Core 2.0 以降が必要)page (Requires ASP.NET Core 2.0 and later)
  • namespacenamespace
  • 関数functions
  • 継承inherits
  • モデルmodel
  • sectionsection
  • helper (現在は ASP.NET Core ではサポートされていません)helper (Not currently supported by ASP.NET Core)

Razor のキーワードは、@(Razor Keyword) でエスケープします (例: @(functions))。Razor keywords are escaped with @(Razor Keyword) (for example, @(functions)).

C# Razor のキーワードC# Razor keywords

  • casecase
  • dodo
  • defaultdefault
  • forfor
  • foreachforeach
  • ifif
  • elseelse
  • locklock
  • switchswitch
  • trytry
  • catchcatch
  • finallyfinally
  • 使用using
  • whilewhile

C# Razor のキーワードは、@(@C# Razor Keyword) で二重にエスケープする必要があります (例: @(@case))。C# Razor keywords must be double-escaped with @(@C# Razor Keyword) (for example, @(@case)). 最初の @ は、Razor パーサーをエスケープします。The first @ escapes the Razor parser. 2 番目の @ は、C# パーサーをエスケープします。The second @ escapes the C# parser.

Razor で使われない予約済みキーワードReserved keywords not used by Razor

  • classclass

ビューに対して生成された Razor C# クラスを調べるInspect the Razor C# class generated for a view

.NET Core SDK 2.1 以降、Razor SDK は Razor ファイルのコンパイルを処理します。With .NET Core SDK 2.1 or later, the Razor SDK handles compilation of Razor files. プロジェクトを作成する際に、Razor SDK はプロジェクト ルートに obj/<build_configuration>/<target_framework_moniker>/Razor ディレクトリを生成します。When building a project, the Razor SDK generates an obj/<build_configuration>/<target_framework_moniker>/Razor directory in the project root. Razor ディレクトリ内のディレクトリ構造は、プロジェクトのディレクトリ構造をミラー化します。The directory structure within the Razor directory mirrors the project's directory structure.

.NET Core 2.1 をターゲットとする ASP.NET Core 2.1 Razor Pages プロジェクト内の次のディレクトリ構造を考えてみましょう。Consider the following directory structure in an ASP.NET Core 2.1 Razor Pages project targeting .NET Core 2.1:

  • Areas/Areas/
    • Admin/Admin/
      • Pages/Pages/
        • Index.cshtmlIndex.cshtml
        • Index.cshtml.csIndex.cshtml.cs
  • Pages/Pages/
    • Shared/Shared/
      • _Layout.cshtml_Layout.cshtml
    • _ViewImports.cshtml_ViewImports.cshtml
    • _ViewStart.cshtml_ViewStart.cshtml
    • Index.cshtmlIndex.cshtml
    • Index.cshtml.csIndex.cshtml.cs

Debug 構成でプロジェクトを作成すると、次の obj ディレクトリが生成されます。Building the project in Debug configuration yields the following obj directory:

  • obj/obj/
    • Debug/Debug/
      • netcoreapp2.1/netcoreapp2.1/
        • Razor/Razor/
          • Areas/Areas/
            • Admin/Admin/
              • Pages/Pages/
                • Index.g.cshtml.csIndex.g.cshtml.cs
          • Pages/Pages/
            • Shared/Shared/
              • _Layout.g.cshtml.cs_Layout.g.cshtml.cs
            • _ViewImports.g.cshtml.cs_ViewImports.g.cshtml.cs
            • _ViewStart.g.cshtml.cs_ViewStart.g.cshtml.cs
            • Index.g.cshtml.csIndex.g.cshtml.cs

Pages/Index.cshtml に対して生成されたクラスを表示するには、obj/Debug/netcoreapp2.1/Razor/Pages/Index.g.cshtml.cs を開きます。To view the generated class for Pages/Index.cshtml, open obj/Debug/netcoreapp2.1/Razor/Pages/Index.g.cshtml.cs.

次のクラスを ASP.NET Core MVC プロジェクトに追加します。Add the following class to the ASP.NET Core MVC project:

using Microsoft.AspNetCore.Mvc.Razor.Extensions;
using Microsoft.AspNetCore.Razor.Language;

public class CustomTemplateEngine : MvcRazorTemplateEngine
{
    public CustomTemplateEngine(RazorEngine engine, RazorProject project) 
        : base(engine, project)
    {
    }
        
    public override RazorCSharpDocument GenerateCode(RazorCodeDocument codeDocument)
    {
        var csharpDocument = base.GenerateCode(codeDocument);
        var generatedCode = csharpDocument.GeneratedCode;

        // Look at generatedCode

        return csharpDocument;
    }
}

Startup.ConfigureServices で、MVC によって追加された RazorTemplateEngineCustomTemplateEngine クラスでオーバーライドします。In Startup.ConfigureServices, override the RazorTemplateEngine added by MVC with the CustomTemplateEngine class:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<RazorTemplateEngine, CustomTemplateEngine>();
}

CustomTemplateEnginereturn csharpDocument; ステートメントにブレークポイントを設定します。Set a breakpoint on the return csharpDocument; statement of CustomTemplateEngine. プログラムの実行がブレークポイントで停止したら、generatedCode の値を表示します。When program execution stops at the breakpoint, view the value of generatedCode.

generatedCode のテキスト ビジュアライザーの表示

ビューの参照と大文字/小文字の区別View lookups and case sensitivity

Razor ビュー エンジンによるビューの参照では、大文字と小文字が区別されます。The Razor view engine performs case-sensitive lookups for views. ただし、実際の参照は、基になるファイル システムによって決定されます。However, the actual lookup is determined by the underlying file system:

  • ファイル ベースのソース:File based source:
    • 大文字と小文字が区別されないファイル システムを使っているオペレーティング システム (Windows など) では、物理的なファイル プロバイダーの参照は大文字と小文字を区別しません。On operating systems with case insensitive file systems (for example, Windows), physical file provider lookups are case insensitive. たとえば、return View("Test") は、/Views/Home/Test.cshtml/Views/home/test.cshtml、その他のすべての大文字と小文字のバリエーションと一致します。For example, return View("Test") results in matches for /Views/Home/Test.cshtml, /Views/home/test.cshtml, and any other casing variant.
    • 大文字と小文字が区別されるファイル システム (たとえば、Linux、OSX、および EmbeddedFileProvider) では、参照は大文字と小文字を区別します。On case-sensitive file systems (for example, Linux, OSX, and with EmbeddedFileProvider), lookups are case-sensitive. たとえば、return View("Test")/Views/Home/Test.cshtml だけと一致します。For example, return View("Test") specifically matches /Views/Home/Test.cshtml.
  • プリコンパイル済みのビュー: ASP.NET Core 2.0 以降では、プリコンパイル済みのビューの参照は、すべてのオペレーティング システムで大文字と小文字を区別しません。Precompiled views: With ASP.NET Core 2.0 and later, looking up precompiled views is case insensitive on all operating systems. 動作は、Windows での物理ファイル プロバイダーの動作と同じです。The behavior is identical to physical file provider's behavior on Windows. 2 つのプリコンパイル済みビューの相違点が大文字と小文字の使い分けだけの場合、参照の結果はどちらになるかわかりません。If two precompiled views differ only in case, the result of lookup is non-deterministic.

開発者には、ファイル名とディレクトリ名の大文字/小文字の使い分けを、次のものと一致させることをお勧めします。Developers are encouraged to match the casing of file and directory names to the casing of:

* <span data-ttu-id="381e8-325">領域、コントローラー、アクションの名前。</span><span class="sxs-lookup"><span data-stu-id="381e8-325">Area, controller, and action names.</span></span>
* <span data-ttu-id="381e8-326">Razor ページ。</span><span class="sxs-lookup"><span data-stu-id="381e8-326">Razor Pages.</span></span>

大文字と小文字の使い分けを一致させると、展開は基になっているファイル システムに関係なくビューを検索できます。Matching case ensures the deployments find their views regardless of the underlying file system.