Razor语法是C#生态中用于构建动态网页视图的模板标记语言,它允许开发者在HTML页面中直接嵌入C#代码,实现页面逻辑和展示内容的结合。作为ASP.NET Core等框架默认的视图引擎语法,Razor的设计理念是让开发者能够以最自然的方式在标记语言中编写服务器端代码,同时保持代码的可读性和可维护性。Razor语法的核心特征是使用@符号作为C#代码与HTML标记之间的切换标识,这种设计使得代码与标记的过渡非常流畅,不需要像传统ASPX页面那样使用大量的<% %>标记来分隔服务器代码和HTML内容。通过Razor,开发者可以在同一个文件中完成页面结构编写和动态逻辑处理,大幅提升了开发效率。

Razor基础语法规则
代码块与表达式
Razor语法中最基础的概念是代码块和表达式。代码块用于包含多行C#逻辑代码,通过@{ }语法定义。在代码块内部,开发者可以声明变量、编写方法调用、执行计算等操作,所有代码都遵循标准的C#语法规则。代码块中声明的变量可以在后续的HTML标记中通过表达式进行输出,实现数据从逻辑层到展示层的传递。需要注意的是,代码块中的C#语句必须以分号结尾,这与常规C#代码的书写规范完全一致。
单行表达式则使用@符号开头,用于直接在HTML中输出变量值或计算结果。当表达式涉及复杂运算或需要明确界定边界时,可以使用@( )括号将表达式包裹起来,确保Razor引擎能够正确解析表达式的范围。例如,当变量名后面紧跟字母或数字时,Razor可能无法区分变量名到哪里结束,此时使用括号就能消除歧义。这种设计使得开发者能够在HTML标记的任意位置插入动态内容,无论是属性值、文本内容还是标记结构的一部分,都能灵活地与C#数据进行交互。
@{
// 声明变量并赋值
string userName = "测试用户";
int userAge = 25;
bool isActive = true;
}
<!-- 输出变量值 -->
<p>用户名:@userName</p>
<p>用户年龄:@userAge</p>
<p>状态:@isActive</p>
<!-- 使用括号明确表达式边界 -->
<p>明年年龄:@(userAge + 1)</p>
<p>用户名长度:@(userName.Length)</p>
常用Razor指令
Razor提供了一系列内置指令,用于在视图层面配置各种行为。这些指令通常放在视图文件的顶部,在HTML内容之前执行,它们不会直接生成输出内容,而是影响视图的编译和运行方式。其中最常用的指令包括@model、@using和@inject等,每个指令都有特定的用途和使用场景。
@model指令用于指定当前视图绑定的模型类型,绑定后可以在视图中通过Model属性访问模型数据,实现强类型的视图开发。这种方式的好处是在编译时就能检查属性名称和类型的正确性,避免运行时错误。@using指令用于引入命名空间,与C#中的using语句功能一致,避免在代码中重复书写完整的命名空间路径。@inject指令则用于从依赖注入容器中获取服务实例,使得视图能够直接使用注入的服务,这在需要调用日志记录、本地化服务等场景中非常实用。除了这些常用指令外,Razor还提供了@page用于Razor Pages路由、@namespace用于指定生成的C#类命名空间等指令。
@model UserViewModel @using System.Collections.Generic @using System.Diagnostics @inject ILogger<UserViewModel> Logger <!-- 通过Model属性访问模型数据 --> <p>模型用户名:@Model.Name</p> <p>模型年龄:@Model.Age</p>
条件判断与循环语法
条件判断
在Razor视图中,条件判断是实现页面动态展示的核心手段之一。Razor完全支持C#中的if、else if和else条件判断语法,开发者只需在@if后面跟上条件表达式和大括号包裹的代码体即可。当条件为真时,大括号内的HTML内容和Razor表达式会被渲染到最终输出中;当条件为假时,则执行对应的else分支。条件判断体中可以包含任意HTML标记、文本内容和嵌套的Razor表达式,这种混合编写方式是Razor模板引擎的核心优势。
条件判断在实际开发中应用广泛,例如根据用户角色显示不同的导航菜单、根据数据状态展示不同的提示信息、根据配置项决定是否渲染某个页面区块等。除了基本的if-else结构外,Razor还支持switch语句,用于处理多分支选择场景。在使用条件判断时,建议将复杂的判断逻辑提取到C#代码块中预先计算,在HTML部分只做简单的条件分支,这样能够保持视图代码的清晰和可读性。同时,条件判断可以多层嵌套,但过深的嵌套会导致代码难以维护,应当尽量避免。
@{
bool isVip = true;
int userLevel = 3;
}
@if (isVip)
{
<p>您是VIP用户,享受专属权益</p>
}
else
{
<p>普通用户,可升级为VIP</p>
}
@* 使用switch进行多分支判断 *@
@switch (userLevel)
{
case 1:
<p>等级:初级用户</p>
break;
case 2:
<p>等级:中级用户</p>
break;
case 3:
<p>等级:高级用户</p>
break;
default:
<p>等级:未知</p>
break;
}
循环语法
循环语法在Razor中同样不可或缺,主要用于遍历集合并重复输出HTML结构。最常用的循环语法包括foreach循环和for循环。foreach循环适用于遍历实现了IEnumerable接口的集合对象,每次迭代可以访问集合中的一个元素,并在循环体内输出对应的HTML标记。for循环则适用于需要索引控制的场景,例如生成序号、按索引访问数组元素等。此外,Razor还支持while循环,但在实际开发中使用较少。
在实际的Web开发场景中,循环语法常用于渲染列表、表格行、导航项等重复性的页面结构。通过循环,开发者可以用简洁的代码生成大量的重复HTML,避免手动编写冗长的标记,同时当数据源发生变化时,页面展示也能自动适应。在使用循环时需要注意空集合的处理,如果集合为空且没有做判断,可能导致页面渲染出空列表或不必要的HTML结构。通常可以结合条件判断,在集合为空时显示提示信息。另外,循环体内可以嵌套条件判断和其他循环,实现复杂的数据展示逻辑。
@{
List<string> tagList = new List<string> { "C#", "Razor", "ASP.NET Core" };
List<string> emptyList = new List<string>();
}
<!-- foreach遍历集合 -->
<ul>
@foreach (var tag in tagList)
{
<li>标签:@tag</li>
}
</ul>
<!-- for循环按索引遍历 -->
<p>数字遍历:</p>
@for (int i = 0; i < 3; i++)
{
<span>@i </span>
}
<!-- 空集合处理 -->
@if (emptyList.Count == 0)
{
<p>暂无数据</p>
}
else
{
@foreach (var item in emptyList)
{
<p>@item</p>
}
}
注释与转义规则
Razor语法中有自己专属的注释方式,使用@* *@包裹注释内容。与HTML注释<!-- -->不同的是,Razor注释不会出现在最终生成并发送到浏览器的HTML输出中,这意味着使用Razor注释可以安全地在视图中记录开发备注,而不用担心注释内容被用户查看页面源代码时看到。这在需要记录业务逻辑说明或开发注意事项时非常有用。HTML注释则会保留在最终输出中,用户可以通过浏览器查看源代码看到这些注释内容,因此敏感信息不应放在HTML注释中。
关于@符号的转义,由于@在Razor中被用作代码切换的特殊字符,当开发者需要在页面中显示@符号本身时,需要使用@@进行转义。Razor引擎在解析时会将@@还原为单个@符号输出到最终HTML中。这一规则在处理包含@符号的文本内容时尤为重要,例如展示邮箱地址时,如果不进行转义,Razor引擎可能会将@后面的内容误解析为C#表达式,从而导致编译错误或运行时异常。此外,在Razor代码块内部,@符号不需要转义,因为代码块内遵循的是C#语法规则,Razor引擎不会对代码块内的@进行特殊处理。
@* 这是Razor注释,不会渲染到页面 *@
@* 可以多行书写,用于记录开发说明 *@
<!-- 这是HTML注释,会出现在最终HTML输出中 -->
<p>邮箱格式示例:user@@ipipp.com</p>
<p>联系方式:admin@@ipipp.com</p>
@{
// 代码块内的@不需要转义
string email = "test@ipipp.com";
}
<p>变量中的邮箱:@email</p>
完整视图页面示例
将前面介绍的各个语法知识点组合起来,可以构建一个完整的Razor视图页面。在实际的ASP.NET Core项目中,一个典型的Razor视图通常包含模型声明、命名空间引入、HTML文档结构、条件判断和循环输出等元素。下面展示一个用户信息页面的完整示例,该页面绑定用户模型,展示用户基本信息并根据年龄判断是否成年,同时遍历输出用户的标签列表。这个示例综合运用了代码块、表达式、条件判断和循环等Razor核心语法。
对应的模型类定义通常放在项目的Models目录下,包含属性定义和必要的数据验证特性。模型类作为视图与控制器之间的数据传递载体,其属性定义直接决定了视图中可以访问的数据字段。在实际项目中,模型类可能还会包含数据注解特性,用于验证输入数据的合法性以及控制显示格式。良好的模型设计能够使视图代码更加简洁,同时保证类型安全和编译时检查的优势。
@model UserViewModel
@using System.Collections.Generic
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>用户信息页</title>
</head>
<body>
<h1>用户详情</h1>
@* 输出用户基本信息 *@
<p>姓名:@Model.Name</p>
<p>年龄:@Model.Age</p>
@* 条件判断:根据年龄显示不同内容 *@
@if (Model.Age >= 18)
{
<p>已成年</p>
}
else
{
<p>未成年</p>
}
@* 循环输出标签列表 *@
<h3>用户标签:</h3>
<ul>
@foreach (var tag in Model.Tags)
{
<li>@tag</li>
}
</ul>
@* 空集合处理 *@
@if (Model.Tags == null || Model.Tags.Count == 0)
{
<p>暂无标签</p>
}
</body>
</html>
// 模型类定义
public class UserViewModel
{
// 用户名属性
public string Name { get; set; }
// 用户年龄属性
public int Age { get; set; }
// 用户标签列表
public List<string> Tags { get; set; }
}
总结来说,Razor语法作为ASP.NET Core框架的默认视图引擎,提供了一套简洁而强大的模板标记语言体系。通过@符号实现代码与标记的自然过渡,配合代码块、表达式、指令、条件判断、循环等语法元素,开发者能够高效地构建动态网页视图。掌握Razor语法的核心规则,包括代码块的定义方式、表达式的输出机制、指令的配置方法、注释和转义的处理规则,是进行ASP.NET Core Web开发的基础技能。在实际项目中,建议遵循关注点分离原则,将复杂的业务逻辑放在控制器或服务层中处理,视图层仅负责数据展示和简单的展示逻辑,这样能够保持代码的清晰结构和良好可维护性。同时,合理使用Razor的强类型模型绑定和依赖注入功能,可以进一步提升开发效率和代码质量。
C#Razor语法模板引擎ASP.NET_Core修改时间:2026-07-22 09:21:46