在 ASP.NET 的不同框架中,模板的实现方式差异很大,我会按照主流的发展脉络,从最经典到最现代,为你详细介绍各种模板方案。

核心概念:为什么需要模板?
在开发动态网站时,我们通常需要将数据(如用户名、商品列表、文章内容)嵌入到静态的 HTML 结构中,模板引擎就是专门用来完成这个工作的工具,它定义了一套语法,让你可以在 HTML 文件中插入动态内容,然后在服务器端将这些内容替换成真实的数据,最终生成完整的 HTML 页面发送给浏览器。
ASP.NET Web Forms (经典方案)
这是最早的 ASP.NET 框架,其核心理念是“事件驱动”和“控件模型”,它的模板系统非常独特。
工作原理:服务器端控件
Web Forms 使用一种特殊的 .aspx 文件作为模板,这个文件看起来像 HTML,但实际上包含了服务器端控件。
特点:

- 文件扩展名:
.aspx - 核心控件:
<asp:Label>: 用于显示文本。<asp:TextBox>: 用于输入文本。<asp:GridView>/<asp:Repeater>: 用于显示数据列表。<%= ... %>: 内联代码块,用于显示变量或方法的值。<%# ... %>: 数据绑定表达式,通常与Eval()或Bind()方法一起使用,在DataBinding事件时执行。
示例:一个简单的 .aspx 模板
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyWebApp.Default" %>
<!DOCTYPE html>
<html>
<head>Web Forms 示例</title>
</head>
<body>
<form id="form1" runat="server">
<h1>欢迎, <asp:Label ID="lblUserName" runat="server" Text="访客"></asp:Label>!</h1>
<p>当前时间: <%= DateTime.Now.ToString() %></p>
<h2>用户列表</h2>
<asp:GridView ID="GridViewUsers" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="Name" HeaderText="姓名" />
<asp:BoundField DataField="Email" HeaderText="邮箱" />
</Columns>
</asp:GridView>
</form>
</body>
</html>
对应的 Default.aspx.cs (后端代码):
using System;
using System.Collections.Generic;
using System.Web.UI;
namespace MyWebApp
{
public partial class Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) // 避免页面回发时重复绑定数据
{
// 1. 设置 Label 控件的值
lblUserName.Text = "张三";
// 2. 准备数据
var users = new List<User>
{
new User { Name = "李四", Email = "lisi@example.com" },
new User { Name = "王五", Email = "wangwu@example.com" }
};
// 3. 将数据绑定到 GridView 控件
GridViewUsers.DataSource = users;
GridViewUsers.DataBind();
}
}
}
public class User
{
public string Name { get; set; }
public string Email { get; set; }
}
}
Web Forms 的模板非常“智能”,但开发者被紧密绑定在它的生命周期和事件模型中,灵活性和对 HTML 的直接控制力较弱,现在已不推荐新项目使用。
ASP.NET MVC (主流方案)
MVC (Model-View-Controller) 模式将应用程序分为三个部分,View (视图) 就是模板。
工作原理:Razor 语法
MVC 引入了 Razor 视图引擎,它使用 .cshtml (C#) 或 .vbhtml (VB.NET) 文件作为模板,Razor 语法简洁、高效,能无缝地在 HTML 中嵌入 C# 代码。

特点:
- 文件扩展名:
.cshtml - 核心语法:
- 符号:用于从代码转义到 HTML。
@variable:显示变量的值。@code { ... }:在视图内定义 C# 代码块。@if,@for,@foreach,@switch:直接使用 C# 流程控制语句。@Html.ActionLink(),@Html.TextBox()等:HTML 辅助方法,用于生成 HTML 标签。
示例:一个简单的 .cshtml 模板
@* 这是 MVC 的视图文件 *@
@{
ViewBag.Title = "用户列表";
Layout = "~/Views/Shared/_Layout.cshtml"; // 使用母版页
// 可以直接在代码块中定义变量
var pageTitle = "所有用户";
}
<h2>@pageTitle</h2>
<p>欢迎来到我们的网站!</p>
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>邮箱</th>
<th>操作</th>
</tr>
</thead>
<tbody>
@* 使用 foreach 循环渲染数据 *@
@foreach (var user in Model)
{
<tr>
<td>@user.Id</td>
<td>@user.Name</td>
<td>@user.Email</td>
<td>
@* 使用 HTML 辅助方法生成链接 *@
@Html.ActionLink("编辑", "Edit", new { id = user.Id }) |
@Html.ActionLink("详情", "Details", new { id = user.Id })
</td>
</tr>
}
</tbody>
</table>
MVC 的 Razor 视图提供了对 HTML 的完全控制,代码清晰,易于测试,是过去十年 ASP.NET 开发的绝对主流,它至今仍然是 ASP.NET Core MVC 的一部分。
ASP.NET Core MVC / Razor Pages (现代方案)
这是目前最新的、微软主推的框架,它继承了 MVC 的思想,并在此基础上进行了优化和现代化。
工作原理:更强大的 Razor 语法
ASP.NET Core 中的 Razor 语法与 MVC 类似,但功能更强大,性能更好,它支持 Razor Pages 和 MVC 两种开发模式。
示例:一个 Razor Pages 模板 (Index.cshtml)
Razor Pages 将页面逻辑(PageModel)和视图放在同一个文件夹下,结构更扁平。
@* 位于 Pages/Index.cshtml *@
@* 使用 `@model` 指令定义传入的数据模型 *@
@page
@model IndexModel
@{
ViewData["Title"] = "首页";
}
<div class="text-center">
<h1 class="display-4">欢迎</h1>
<p>学习关于 <a href="https://docs.microsoft.com/aspnet/core">构建 Web 应用程序 with ASP.NET Core</a> 的信息。</p>
</div>
<h3>产品列表</h3>
<ul>
@* 直接访问 PageModel 中定义的属性 *@
@foreach (var product in Model.Products)
{
<li>@product.Name - (@product.Price.ToString("C"))</li>
}
</ul>
对应的 Index.cshtml.cs (Page Model):
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Collections.Generic;
namespace MyWebApp.Pages
{
public class IndexModel : PageModel
{
// 定义一个公共属性来存储数据
public List<Product> Products { get; set; }
public void OnGet()
{
// 在页面请求时,填充数据
Products = new List<Product>
{
new Product { Name = "笔记本电脑", Price = 5999 },
new Product { Name = "无线鼠标", Price = 99 },
new Product { Name = "机械键盘", Price = 499 }
};
}
}
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}
}
ASP.NET Core 的 Razor 是目前最推荐的方案,它轻量、跨平台、高性能,并且与前端框架(如 Angular, React, Vue)的集成非常顺畅。
使用第三方模板引擎
除了 Razor,你还可以在 ASP.NET 项目中使用其他流行的模板引擎,它们通常有自己的语法。
常见引擎:
- RazorEngine: 一个独立的、轻量级的 Razor 引擎,你可以在任何 .NET 项目中使用它来解析
.cshtml模板字符串,而无需 ASP.NET 的运行时环境。 - Nustache: 基于 Mustache 语法,语法非常简洁,逻辑与视图分离得很好,支持多种语言。
- DotLiquid: Ruby 的 Liquid 模板引擎的 .NET 移植版本,非常安全,适合在需要限制用户输入模板的场景下使用(如 CMS 系统)。
示例:使用 Nustache 渲染模板
模板 (template.mustache):
<h1>{{subject}}</h1>
<p>{{body}}</p>
<ul>
{{#items}}
<li>{{name}} - {{value}}</li>
{{/items}}
</ul>
C# 代码:
using Nustache.Core;
string template = System.IO.File.ReadAllText("template.mustache");
var data = new
{
subject = "我的报告",
body = "这是报告的正文内容。",
items = new[]
{
new { name = "项目 A", value = 100 },
new { name = "项目 B", value = 200 }
}
};
string renderedHtml = Render.StringToString(template, data);
Console.WriteLine(renderedHtml);
第三方引擎提供了更多的选择,适用于特定的场景,比如需要将模板存储在数据库中,或者希望在非 Web 应用中生成 HTML 报告等,但在标准的 ASP.NET Web 开发中,Razor 是首选。
总结与对比
| 特性 | ASP.NET Web Forms | ASP.NET MVC / Razor | ASP.NET Core Razor | 第三方引擎 |
|---|---|---|---|---|
| 核心思想 | 事件驱动,控件模型 | MVC 分层架构 | MVC 分层 + Razor Pages | 纯文本替换 |
| 模板文件 | .aspx |
.cshtml |
.cshtml |
.mustache, .html 等 |
| 模板语法 | 服务器控件 <asp:...>, <%=%> |
Razor | Razor (更强大) | 各自语法 (如 ) |
| HTML 控制 | 弱,被控件封装 | 强,完全控制 | 强,完全控制 | 强,完全控制 |
| 与现代前端集成 | 困难 | 良好 | 极佳 | 良好 |
| 推荐度 | 仅维护旧项目 | 仍在使用,但新项目推荐 Core | 强烈推荐 (新项目首选) | 特定场景使用 |
给你的建议
-
如果你要开始一个全新的 ASP.NET Web 项目:
- 首选 ASP.NET Core,并使用 Razor 或 Razor Pages 作为你的模板引擎,这是最现代、最高效、社区支持最好的方案。
-
如果你在维护一个旧的 ASP.NET Web Forms 项目:
继续使用 Web Forms 的模板系统,如果未来需要重构,可以考虑逐步迁移到 ASP.NET Core。
-
如果你有非常特殊的模板需求:
- 比如模板内容需要从数据库动态加载,或者你需要一个与业务逻辑完全无关的、纯粹的模板引擎,那么可以考虑 RazorEngine 或 Nustache。
希望这个详细的指南能帮助你理解 ASP.NET 中的 HTML 网页模板!
