Razor语法学习详细记录

Razor语法

Razor 支持 c #,并使用 @ 符号从 HTML 转换为 c #。 Razor 计算 c # 表达式并在 HTML 输出中呈现。
当 @ 符号后跟 Razor 保留关键字时,它会转换为 Razor 特定标记。 否则会转换为纯 C#。
若要对 @ 标记中的符号进行转义 Razor ,请使用第二个 @ 符号:

<p>@@Username</p>
<p>@Username</p>

包含电子邮件地址的 HTML 属性和内容不将 @ 符号视为转换字符。 以下示例中的电子邮件地址将通过分析来保持不变 Razor :

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

隐式 Razor 表达式

隐式 Razor 表达式以开头, @ 后跟 c # 代码:

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

隐式表达式不能包含空格,但 C# await 关键字除外。 如果该 C# 语句具有明确的结束标记,则可以混用空格:

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

隐式表达式 不能 包含 C# 泛型,因为括号 (<>) 内的字符会被解释为 HTML 标记。 以下代码 无 效:

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

上述代码生成与以下错误之一类似的编译器错误:
“int” 元素未结束。 所有元素都必须自结束或具有匹配的结束标记。
无法将方法组 “GenericMethod” 转换为非委托类型 “object”。 是否希望调用此方法?`
泛型方法调用必须在显式 Razor 表达式或 Razor 代码块中进行包装。

显式 Razor 表达式

显式 Razor 表达式由 @ 带对称括号的符号组成。 若要呈现上周的时间,请 Razor 使用以下标记:

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

将计算 @() 括号中的所有内容,并将其呈现到输出中。
前面部分中所述的隐式表达式通常不能包含空格。 在下面的代码中,不会从当前时间减去一周:

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

该代码呈现以下 HTML:

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

可以使用显式表达式将文本与表达式结果串联起来:

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

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

如果不使用显式表达式,

Age@joe.Age

会被视为电子邮件地址,因此会呈现

Age@joe.Age

。 如果编写为显式表达式,则呈现

Age33


显式表达式可用于从 .cshtml 文件中的泛型方法呈现输出。 以下标记显示了如何更正之前出现的由 C# 泛型的括号引起的错误。 此代码以显式表达式的形式编写:
<p>@(GenericMethod<int>())</p>

表达式编码

计算结果为字符串的 C# 表达式采用 HTML 编码。 计算结果为 IHtmlContent 的 C# 表达式直接通过 IHtmlContent.WriteTo 呈现。 计算结果不为 IHtmlContent 的 C# 表达式通过 ToString 转换为字符串,并在呈现前进行编码。

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

前面的代码呈现以下 HTML:

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

HTML 在浏览器中显示为纯文本:
<跨越 > Hello World < /span>
HtmlHelper.Raw 输出不进行编码,但呈现为 HTML 标记。

警告

对未经审查的用户输入使用 HtmlHelper.Raw 会带来安全风险。 用户输入可能包含恶意的 JavaScript 或其他攻击。
审查用户输入比较困难。 应避免对用户输入使用 HtmlHelper.Raw。 CSHTML

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

该代码呈现以下 HTML:

<span>Hello World</span>

Razor 代码块

Razor 代码块以开头 @ ,并由括起来 {} 。 代码块内的 C# 代码不会呈现,这点与表达式不同。 一个视图中的代码块和表达式共享相同的作用域并按顺序进行定义:


@{
    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:

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

在代码块中,使用标记将本地函数声明为用作模板化方法:

@{
    void RenderName(string name)
    {
        <p>Name: <strong>@name</strong></p>
    }

    RenderName("Mahatma Gandhi");
    RenderName("Martin Luther King, Jr.");
}

该代码呈现以下 HTML:

<p>Name: <strong>Mahatma Gandhi</strong></p>
<p>Name: <strong>Martin Luther King, Jr.</strong></p>

隐式转换

代码块中的默认语言是 c #,但 Razor 页面可转换回 HTML:

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

带分隔符的显式转换
若要定义应呈现 HTML 的代码块的子节,请将字符括在标记后 Razor

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

使用此方法可呈现未被 HTML 标记括起来的 HTML。 如果没有 HTML 或 Razor 标记,则 Razor 会发生运行时错误。
标记可用于在呈现内容时控制空格:
仅呈现 标记之间的内容。
标记之前或之后的空格不会显示在 HTML 输出中。

显式行转换

要在代码块内以 HTML 形式呈现整个行的其余内容,请使用 @: 语法:

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

如果 @: 代码中没有,则 Razor 会生成运行时错误。
@文件中的额外字符 Razor 可能会导致在块中后面的语句中出现编译器错误。 这些编译器错误可能难以理解,因为实际错误发生在报告的错误之前。 将多个隐式/显式表达式合并到单个代码块以后,经常会发生此错误。
控制结构
控制结构是对代码块的扩展。 代码块的各个方面(转换为标记、内联 C#)同样适用于以下结构:

条件语句 @if, else if, else, and @switch

@if 控制何时运行代码:

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

else 和 else if 不需要 @ 符号:

@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 语句:

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

Hal @for, @foreach, @while, and @do while

可以使用循环控制语句呈现模板化 HTML。 若要呈现一组人员:

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

支持以下循环语句:@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);

复合语句 @using

在 C# 中,using 语句用于确保释放对象。 在中 Razor ,使用相同的机制来创建包含其他内容的 HTML 帮助器。 在下面的代码中,HTML 帮助程序使用 @using 语句呈现 标记:

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

@try, catch, finally

异常处理与 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 语句保护关键部分:

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

注释
Razor 支持 c # 和 HTML 注释:

@{
    /* C# comment */
    // Another C# comment
}

该代码呈现以下 HTML:

<!-- HTML comment -->

Razor 在呈现网页之前,服务器将删除注释。 Razor 用于 @* *@ 分隔注释。 以下代码已被注释禁止,因此服务器不呈现任何标记:

@*
    @{
        /* C# comment */
        // Another C# comment
    }
    <!-- HTML comment -->
*@
上一篇:如何使用C#将模型带入视图?


下一篇:C#-登录用户数据的ASP.NET身份编辑?