ASP.NET Core에 대한 Razor 구문 참조Razor syntax reference for ASP.NET Core

작성자: Rick Anderson, Luke Latham, Taylor MullenDan VicarelBy Rick Anderson, Luke Latham, Taylor Mullen, and Dan Vicarel

Razor는 웹 페이지에 서버 기반 코드를 포함하는 태그 구문입니다.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 태그에서 @ 기호를 이스케이프하려면 두 번째 @ 기호를 사용합니다.To escape an @ symbol in Razor markup, use a second @ symbol:

<p>@@Username</p>

코드는 단일 @ 기호를 사용하여 HTML로 렌더링됩니다.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>

암시적 식은 C# 제네릭을 포함할 수 없습니다. 대괄호(<>) 안에 있는 문자가 HTML 태그로 해석되기 때문입니다.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:

  • "Int" 요소가 종료되지 않았습니다.The "int" element wasn't closed. 모든 요소는 하나 있어야 자체적으로 닫히거나 일치하는 끝 태그가 있어야 합니다.All elements must be either self-closing or have a matching end tag.
  • 'GenericMethod' 메서드 그룹을 비대리자 형식 '개체'로 변환할 수 없습니다.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. 지난 주의 시간을 렌더링하기 위해 다음 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. 다음 코드에서 일주일은 현재 시간에서 차감되지 않습니다.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. 이 오류는 여러 암시적/명시적 식을 단일 코드 블록에 결합한 이후에 자주 발생합니다.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>
}

elseelse 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;
}

Looping @for, @foreach, @while 및 @do whileLooping @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 문을 사용하여 form 태그를 렌더링합니다.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 주석은 웹 페이지가 렌더링되기 전에 서버에서 제거됩니다.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 Viewing 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. 이 지시문은 보기가 파생되는 클래스를 생성한 RazorPage<T>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. 자세한 내용은 강력한 형식의 모델 및 @모델 키워드를 참조하세요.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 지시문은 layout과 함께 사용되어 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

태그 도우미와 관련된 세 가지 지시문이 있습니다.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

  • 페이지(ASP.NET Core 2.0 이상 필요)page (Requires ASP.NET Core 2.0 and later)
  • 네임스페이스(namespace)namespace
  • 함수functions
  • 상속inherits
  • 모델model
  • sectionsection
  • 도우미(현재 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
  • usingusing
  • 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. 두 번째 @은 C# 파서를 이스케이프합니다.The second @ escapes the C# parser.

Razor에서 사용하지 않는 예약된 키워드Reserved keywords not used by Razor

  • 클래스class

보기에 대해 생성된 Razor C# 클래스 보기Viewing the Razor C# class generated for a view

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;
    }
}

MVC에서 추가한 RazorTemplateEngineCustomTemplateEngine 클래스로 재정의합니다.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 break point on the return csharpDocument statement of CustomTemplateEngine. 중단점에서 프로그램 실행이 중지되면 generatedCode의 값을 확인합니다.When program execution stops at the break point, 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 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. 미리 컴파일된 두 보기의 대소문자만 다른 경우 조회 결과가 불명확합니다.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="f4dce-293">영역, 컨트롤러 및 작업 이름.</span><span class="sxs-lookup"><span data-stu-id="f4dce-293">Area, controller, and action names.</span></span> 
* <span data-ttu-id="f4dce-294">Razor 페이지.</span><span class="sxs-lookup"><span data-stu-id="f4dce-294">Razor Pages.</span></span>

대/소문자를 일치시키면 배포 시 기본 파일 시스템에 관계 없이 해당 보기를 잘 찾습니다.Matching case ensures the deployments find their views regardless of the underlying file system.