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

asp.net html网页模板
(图片来源网络,侵删)

核心概念:为什么需要模板?

在开发动态网站时,我们通常需要将数据(如用户名、商品列表、文章内容)嵌入到静态的 HTML 结构中,模板引擎就是专门用来完成这个工作的工具,它定义了一套语法,让你可以在 HTML 文件中插入动态内容,然后在服务器端将这些内容替换成真实的数据,最终生成完整的 HTML 页面发送给浏览器。


ASP.NET Web Forms (经典方案)

这是最早的 ASP.NET 框架,其核心理念是“事件驱动”和“控件模型”,它的模板系统非常独特。

工作原理:服务器端控件

Web Forms 使用一种特殊的 .aspx 文件作为模板,这个文件看起来像 HTML,但实际上包含了服务器端控件。

特点:

asp.net 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# 代码。

asp.net html网页模板
(图片来源网络,侵删)

特点:

  • 文件扩展名: .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 PagesMVC 两种开发模式。

示例:一个 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 项目中使用其他流行的模板引擎,它们通常有自己的语法。

常见引擎:

  1. RazorEngine: 一个独立的、轻量级的 Razor 引擎,你可以在任何 .NET 项目中使用它来解析 .cshtml 模板字符串,而无需 ASP.NET 的运行时环境。
  2. Nustache: 基于 Mustache 语法,语法非常简洁,逻辑与视图分离得很好,支持多种语言。
  3. 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,并使用 RazorRazor Pages 作为你的模板引擎,这是最现代、最高效、社区支持最好的方案。
  • 如果你在维护一个旧的 ASP.NET Web Forms 项目:

    继续使用 Web Forms 的模板系统,如果未来需要重构,可以考虑逐步迁移到 ASP.NET Core。

  • 如果你有非常特殊的模板需求:

    • 比如模板内容需要从数据库动态加载,或者你需要一个与业务逻辑完全无关的、纯粹的模板引擎,那么可以考虑 RazorEngineNustache

希望这个详细的指南能帮助你理解 ASP.NET 中的 HTML 网页模板!