.NET 中利用 Razor 引擎生成代码,本质上是赋予你的 HTML 标记动态能力。Razor 视图引擎允许你将 C 代码片段无缝地嵌入到 HTML 标记中,从而实现服务器端的数据渲染。这种方式让你可以根据服务器上的数据动态地构建 HTML 结构,让页面内容变得鲜活起来。
我们来深入探讨一下这个过程。
Razor 的核心概念:标记与代码的交融
Razor 的设计哲学是让开发者能够以一种直观、易于理解的方式编写动态网页。它不是让你编写复杂的 HTML 生成器类,而是直接在 HTML 文件中写 C 代码。这种融合是 Razor 的魅力所在。
你会看到 Razor 文件(通常以 `.cshtml` 为扩展名)包含大量的 HTML 标记,就像你编写普通静态 HTML 文件一样。但关键的区别在于,你可以在这些 HTML 标记的任何地方插入 C 代码块。
插入 C 代码:@ 符号的魔力
Razor 引擎的核心标识符是 `@` 符号。这个小小的符号是连接 HTML 世界和 C 世界的桥梁。
表达式语句: 最简单直接的用法是 `@` 后面跟着一个 C 表达式。Razor 引擎会在运行时计算这个表达式,并将结果以字符串的形式插入到 HTML 中。
例如,如果你有一个 C 变量 `userName`,你想在页面上显示它,可以这样做:
```html
欢迎,@userName!
```
当 Razor 引擎处理这个文件时,它会找到 `userName` 变量的值,并将其替换掉 `@userName`。
代码块: 当你需要执行更复杂的 C 代码,比如循环、条件判断,或者调用方法时,你可以使用 `@` 符号后跟一个代码块。代码块用大括号 `{}` 包围,允许你编写多行 C 代码。
条件语句 (`@if`):
```html
@if (isAdmin)
{
您是管理员,拥有特殊权限。
}
else
{
您是普通用户。
}
```
这里的 `isAdmin` 是一个布尔型的 C 变量。Razor 引擎会根据 `isAdmin` 的值来决定显示哪一段 HTML。
循环语句 (`@foreach`): 这是生成列表或表格时最常用的功能。
```html
@foreach (var item in items)
{
- @item.Name
}
```
这里的 `items` 是一个包含多个对象的集合(比如 `List
`)。`@foreach` 语句会遍历这个集合,为每个 `item` 生成一个 `` 元素,并在其中显示 `item.Name` 的值。
`@using` 指令: 在 Razor 文件顶部,你通常会看到 `@using` 指令,它类似于 C 代码文件中的 `using` 语句,用于引入命名空间,这样你就可以直接使用命名空间中的类型,而无需写完整的命名空间前缀。
```cshtml
@using YourApplication.Models
@using System.Collections.Generic
@{
var products = new List();
// ... 填充 products 列表
}
产品列表
@foreach (var product in products)
{
- @product.Name @product.Price.ToString("C")
}
```
Razor 视图的上下文
Razor 视图通常与一个模型(Model)相关联。这个模型包含了需要展示给用户的数据。在 Razor 文件中,你可以通过 `@Model` 属性来访问这个模型。
强类型视图: 这是 Razor 最推荐的用法。你可以在 Razor 文件的顶部声明视图将使用哪种类型的模型。
```cshtml
@model YourApplication.Models.ProductListViewModel
@Model.PageTitle
名称 |
价格 |
---|
@foreach (var product in Model.Products)
{
@product.Name |
@product.Price.ToString("C") |
}
```
在这里,`ProductListViewModel` 是一个 C 类,包含了 `PageTitle` (字符串) 和 `Products` (一个产品列表) 属性。通过 `@model` 指令,Razor 引擎知道如何正确地强类型地访问数据,并且提供了编译时类型检查,这能大大减少错误。
动态视图 (不推荐): 尽管 Razor 允许动态模型,但这会失去强类型的好处,并且难以进行代码分析和错误检测。一般情况下,应优先使用强类型视图。
Razor 布局页(Layout Pages)
Razor 的另一个强大之处在于布局页。你可以创建一个主布局文件(通常命名为 `_Layout.cshtml`),它包含了网站的通用结构,如页眉、页脚、导航栏等。然后,其他视图文件可以指定使用这个布局页,从而避免重复编写相同的 HTML 结构。
在布局页中,你会看到 `@RenderBody()` 占位符。当一个视图使用了这个布局页时,该视图的全部内容(除了布局页中已经有的部分)会被渲染到 `_Layout.cshtml` 中的 `@RenderBody()` 位置。
_Layout.cshtml (示例):
```html