Razor 语法混合了C#代码,HTML标记。一般情况下Razor 文件以cshtml作为扩展名,或者在Blazor的Razor 组件中以razor作为扩展名。
语法
Razor以字符@从HTML转换到C#, Razor会运行C#表达式,并输出HTML内容。同时需要注意当在Razor中以@+Razor保留关键字,它会转到Razor特定的标记,否则是转到换到普通的C#代码。
为了在Razor标记中对字符@逃逸,我们需要使用两个@, 例如:
<p>@@Username</p>
在Razor输出如下结果:
<p>@Username</p>
在HTML 标记的属性和标记内容中使用电子邮件地址,不会对字符@进行转义:
<ahref="mailto:Support@contoso.com">Support@contoso.com</a>
Razor隐式表达式
隐式表达式是以@字符后面跟C#代码
<p>@DateTime.Now</p>
<p>@DateTime.IsLeapYear(2016)</p>
需要注意的是Razor隐式表达式中不能使用泛型。如果在隐式表达式中使用泛型的话,Razor编译会出错。
Razor显式表达式
显式表达式的语法是:@(表达式), 如:
<p>Last week this time: @(DateTime.Now - TimeSpan.FromDays(7))</p>
在显式表达式中的C#表达式会运行之后,并输出为HTML输出。
同时在显式表达式中可以使用泛型:
<p>@(GenericMethod<int>())</p>
表达式编码
C#表达式运行结果被Razor输出为HTML编码,例如C#表达式:
@("<span>HelloWorld</span>")
输出为:
<span>Hello World</span>
进行编码后的输出避免造成页面的安全性问题,例如用户直接在代码中输出javascript代码。
另外需要注意,如果用户直接调用Html.Raw()方法输出的话,输出结果不会被编码。
Razor代码块
Razor代码块是以@+ {} 表示代码块,代码块不像表达式,代码块并不输出内容,这是和表达式最为重要的区别。例如:
上述代码块定义变量名,使用表达式输出内容。
另外可以在代码块使用本地方法和HTML标记结合可以定义模板方法,如下图:
输出为:
隐式转换
默认的代码块语言是C#,但是Razor 页面会转换回HTML 标记,例如:
显式分隔符转换
在代码块中为了显式的对小段的代码转换为HTML 标记,使用<text>将需要转换的内容引用起来,即可以完成显式转换。
需要注意的是使用<text>进行转换,只有在<text>标记中的内容会转换输出。<text>前端和后端不能留有空白。
显式行转换
为了在代码块中输出一行中所有的内容,需要使用@: 进行显式行转换:
在代码块中如果有多余@字符会引发Razor编译错误,而且这类的错误非常难以跟踪和排查,所以尽量注意在代码块中对于字符@的使用。
流程控制
Razor的流程控制实际上是代码块的扩展。上述所有在代码块中的概念都可以在流程控制结构中使用,目前Razor支持如下的流程控制:@if, else if, else, @switch, 使用实例如下:
循环控制
Razor Page目前支持如下的循环控制:@for, @foreach, @while, @do while.
@using 语句
在C#中使用using 语句确保某个对象在使用完后被正确的释放(disposed), 在Razor中也可以直接使用using语句,如下图使用Html helper 生成一个form.
@try, catch, finally
异常捕获在Razor中也是类似于直接在C#代码中的语法
@Lock
Razor可以使用lock 保护重要的代码块:
注释
Razor支持C#和HTML的注释。
例如//, /*, */, 以及<!-- -->
同时需要注意的是在Razor 组件中,也可以使用如下的注释
@* … @
指令
Razor 指令以@ + Razor 保留关键字,明确的指明需要使用什么指令,并且这些指令会改变和使用Razor的不同的功能。
关于如何理解指令,先理解,所有的Razor页面最终会被编译成我们熟悉的C#类。
@attribute
@attribute指令给Razor页面指定需要使用的属性,从而定义生成的C#类的一些特性,例如
@code
@code是Razor 组件专用,用于在@code代码块中定义页面类需要的字段,属性,方法等定义。@code是@functions的别名。但是建议在Razor组件中使用@code,而非@functions.
@implements 指令,类比如C#类的implements.
@inherits: 类比C#的中继承。
@inject: 从DI容器中引入需要的类。
@layout: 指定页面需要继承的布局模板。
@model: 专用于MVC 视图和Razor Page页面,用于指定model
@namespace: 用户指定生成的页面类所处的名称空间。
@page指令:用户razor page项目或者razor 组件,用于定义路由。
@preservewhitespace: 是否保留空白,默认是false.
@section: 用户razor page或者是mvc
@using:
如下指令专用于Razor 组件:
@attributes,@bind, @on{EVENT}, @on{Event}:preventDefault, @on{event}:stopPropagation, @key,@ref, @typeparam
Razor保留关键字:
C# Razor 保留关键字:
要逃逸保留关键字必须使用如下的语法:
Razor keywords are escaped with @(Razor Keyword) (forexample, @(functions)).
和:
C# Razor keywords must be double-escaped with @(@C# Razor Keyword)(for example, @(@case)). The first @ escapes the Razor parser. The second @escapes the C# parser.
发表评论