ASP.NET Core Razor 语法简述

作者:叫我少年日期:2026/5/30

如果写过 HTML 里嵌 <?php ?>​ 的页面吧?Razor 干的事差不多,只不过嵌入式用的是 C#。Razor 标记可以塞进 .cshtml​(MVC 视图/Razor Pages)或者 .razor​(Blazor 组件),写法跟 Vue 的模板语法有几分神似。下面从最基础的开始,一路讲到那些容易被忽视的坑。

1. 怎么输出 HTML

Razor 的默认语言就是 HTML,你写 <p>Hello</p>​,它就乖乖输出 <p>Hello</p>​。但是想混入 C# 逻辑的时候,就得靠 @ 符号了。

2. @ 符号的用法

@ 是 Razor 的开关——从 HTML 模式切到 C# 模式。

  • 输出 @本身:写 @@​,比如 @@Username​ 输出就是 @Username
  • 邮件地址里的 @ ​:Razor 不会碰它,Support@contoso.com 照原样输出。
  • 隐式表达式@DateTime.Now​,直接跟在 @​ 后面的 C# 代码。不能有空格(await​ 例外),也不能写泛型——<> 会被当成 HTML 标签。
  • 显式表达式@(DateTime.Now - TimeSpan.FromDays(7))​,括号里头随便写,泛型也行:@(GenericMethod<int>())

3. SVG 里的 Razor

SVG 的 foreignObject 元素里可以用 Razor 表达式,没什么特别的限制。

4. 表达式编码

字符串表达式默认会被 HTML 编码。@("<span>bold</span>")​ 输出的是 &lt;span&gt;bold&lt;/span&gt; 文本,而不是一个 span 标签。

非要输出原始 HTML,用 @Html.Raw(...)​。但注意:永远别对用户的输入用 Raw,那是 XSS 漏洞直通车。

5. 代码块

@{ ... } 把多行 C# 代码包起来,里面的代码不会直接输出。但你可以在代码块里嵌套 HTML:

1 @{
2     var name = "张三";
3     <p>你好,@name</p>
4 }
5

你还可以在代码块里定义本地函数:

1 @{
2     void RenderName(string name) {
3         <p>@name</p>
4     }
5     RenderName("李四");
6 }
7

6. 从 C# 切回 HTML

代码块里想回到 HTML 模式,有 3 种办法:

方式示例说明
直接写 HTML<div>内容</div>碰到 HTML 标签自动切回
<text>标签<text>纯文本</text>输出纯文本,不生成 DOM 元素
​@:​语法​@:这是一行文本把整行切回 HTML

常见坑:代码块里多写一个 @ 就会引发诡异的编译器错误,排查起来很头大。

7. 条件属性呈现

属性值是 null​ 或 false​ 时,Razor 会直接省略该属性。比如 class="@false"​ 最终输出 <div>False</div>​(因为 false​ 不是 null​ 也不是 false 这个单词,它是布尔值)。

例外data-​ 属性就算值为 null​ 或 false 也会保留。

8. 控制结构一览

类型语法
条件​@if​,else if​,else​,@switch
循环​@for​,@foreach​,@while​,@do while
复合语句​@using (Html.BeginForm()) { ... }
异常​@try ... catch ... finally
​@lock (SomeLock) { ... }

9. 三种注释

  • C# 注释/* ... */​ 和 // ...,在服务端处理,不会到客户端。
  • HTML 注释<!-- ... -->,会发送到浏览器。
  • Razor 注释@* ... *@,服务端直接删除,客户端拿不到。适合隐藏敏感逻辑。

10. 指令大全

指令是 Razor 的「元操作」,控制页面怎么编译、怎么跑、从哪拿数据。

指令干的事用在哪儿
​@attribute往生成的类上加属性,比如[Authorize]视图/页面/组件
​@code加 C# 成员(属性、方法)​.razor组件
​@functions同上,但用于.cshtml​.cshtml视图
​@implements实现接口所有文件
​@inherits指定自定义基类所有文件
​@inject依赖注入所有文件
​@layout指定布局​.razor组件
​@model指定强类型模型​.cshtml
​@namespace设置命名空间导入文件(_ViewImports.cshtml)
​@page声明为可路由的页面/组件​.cshtml​/.razor
​@preservewhitespace控制是否保留多余空白​.razor
​@rendermode设置 Blazor 渲染模式​.razor
​@section定义布局节​.cshtml
​@typeparam泛型类型参数​.razor
​@using添加using指令所有文件

11. 指令属性

这些属性直接用在 HTML 标签上:

  • @attributes:批量展开任意属性(仅限组件)
  • @bind​、@bind:culture:双向数据绑定 + 区域性格式
  • @formname:防止表单冲突
  • @on{event}​、@on{event}:preventDefault​、@on{event}:stopPropagation:事件处理全家桶
  • @key:保留元素/组件身份(Diff 算法用)
  • @ref:获取组件实例引用

12. 模板化 Razor 委托

可以用 @<tag>...</tag> 定义一段 UI 模板,赋值给委托变量:

1 @{
2     Func<dynamic, object> itemTemplate = @<li>@item</li>;
3 }
4 <ul>@itemTemplate("A")@itemTemplate("B")</ul>
5

也可以当参数传给方法——比如定义一个 Repeat 方法,接收模板委托做内联渲染。

13. 标记帮助程序指令

  • @addTagHelper:注册标记帮助程序
  • @removeTagHelper:移除已注册的
  • @tagHelperPrefix​:设置前缀(比如 <vc:...>

14. 保留关键字

有些词 Razor 自己用了,你不能直接拿来当变量名。

Razor 关键字(需用 @(keyword)​ 转义):page​, namespace​, functions​, inherits​, model​, section​, helper(不支持了但保留)

C# Razor 关键字(需用 @(@keyword)​ 双转义):case​, do​, default​, for​, foreach​, if​, else​, lock​, switch​, try​, catch​, finally​, using​, while

未使用的保留关键字class

15. 调试小技巧:查看编译器生成的 C# 类

.csproj 里加一行:

1 <PropertyGroup>
2   <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
3 </PropertyGroup>
4

编译后在 obj/Debug/net9.0/Razor/​ 目录下找 .g.cshtml.cs 文件,能看到 Razor 把你的标记翻译成了什么 C# 代码。排查绑定错误时特别好用。

16. 视图查找与大小写

  • Windows 文件系统不区分大小写,Linux/macOS 区分。但预编译视图不区分。
  • 建议统一用小写命名,跨平台迁移时不踩坑。

17. 默认导入

_ViewImports.cshtml 默认帮你 using 了这些命名空间,开箱即用:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Threading.Tasks;
5 using Microsoft.AspNetCore.Mvc;
6 using Microsoft.AspNetCore.Mvc.Rendering;
7 using Microsoft.AspNetCore.Mvc.ViewFeatures;
8

一点背景:Razor 最早出现在 ASP.NET MVC 3(2011 年),取代了古老的 Web Forms 视图引擎。到 ASP.NET Core 时代,它不仅是 MVC 的视图引擎,还成了 Blazor 组件的基础。虽然本文描述的某些底层机制在 ASP.NET Core 3.0 后有所调整,但核心语法几乎没有变过。


ASP.NET Core Razor 语法简述》 是转载文章,点击查看原文


相关推荐


Layui结合springboot读取返回值,前端展示简单示例
一个心烑2026/5/7

一、SpringBoot 后端接口 + Layui 前端页面实现 1 后端返回 JSON 数据 2 前端 Layui 表格展示数据 3 前端表单提交保存到后端 4 完整的异步请求(Ajax)处理 项目结构(标准 SpringBoot): springboot-layui-demo/ ├── src/main/java/com/demo/ │ ├── controller/ │ │ └── UserController.java # 接口控制器 │ ├── entity/ │


算个账也要开顶配 AI?我让 AI 自己劝我换了个小的
小墨同学boy2026/4/28

其实我自己每个月在 AI 上花的钱不少,Claude、GPT、GLM 都有订阅。但其实有很大一部分预算其实是花在处理生活琐事上的——记账、外卖归类、做一个消费数据分析。这种活差不多每天都得跑一遍,所以token 烧得也不少,尤其是有时候开了深度思考的模型反而更容易给错数据。 后来我才反应过来,手里订阅一个不少,结果我一直在拿 Opus 的钱让它当我的计算器。有点奢侈了,所以我准备切换思路看看有没有节省token的办法。 一、我发现一个反直觉的事 在日常生活当中,我的直觉一直是有钱就上好的贵的效果


2026 年前端工程师面试:一份来自面试官视角的真实复盘
怕浪猫2026/4/19

前言:为什么我要写这篇文章 前两天和一个在高校和企业都面试过不少候选人的"面试官老炮"聊天,他听过太多候选人抱怨面试内容脱离实际、工作用不到。也听过面试官抱怨候选人只会背题、动手能力差。有意思的是,这两拨人的抱怨,往往都对。 今天我想换个视角——不站在候选人角度刷题,也不站在理论派角度讲八股文,而是站在有实际招聘需求、真正要带团队干活的面试官视角,聊聊 2026 年的前端工程师面试,到底在考什么、为什么这么考。 核心结论先行 2026 年的前端面试,考察维度已经发生了结构性变化:


【折腾】windows下小狼毫输入法更新字库
stereohomology2026/4/11

我问DeepSeek如何更新,而不是自己从文档里面找,结果效率很高、回答很全面,直接给出步骤和命令。 作为菜鸟,我用第一种方法: 这个错误提示很明确:你当前所在的目录(即小狼毫的用户文件夹)不是空的,而 git clone 要求目标目录必须是空目录才能执行。 小狼毫默认安装后,用户文件夹里会自带一些基础配置文件(比如 default.custom.yaml、weasel.custom.yaml、luna_pinyin.schema.yaml 等)。直接 git clone 到非空目录就会报这个


吴恩达《LangChain LLM 应用开发精读笔记》8-Document Loading 文档加载
勇气要爆发2026/4/3

大家好,我是飞哥!👋 欢迎来到吴恩达《LangChain:Chat with Your Data》系列课程的第二讲。上一讲我们了解了 RAG 的全流程,今天我们正式开工,攻克第一关:Document Loading (文档加载)。 1. 为什么:Garbage In, Garbage Out 🗑️ 💡 场景锚定 做饭要先买菜洗菜,训练 AI 也是一样。如果你喂给 AI 的数据格式乱七八糟、乱码满天飞,那么 AI 输出的答案肯定也是一塌糊涂。 PDF 里有复杂的表格和页眉页脚。网页里有一堆


CSS 全栈指南:从基础到 2025 新特性
橘子编程2026/3/25

CSS 知识详解 从层叠规则到现代布局,从自定义属性到容器查询,系统梳理 CSS 全栈知识,涵盖 W3C 2025 最新特性,助你写出优雅、高性能的样式代码。 目录 什么是 CSS语法与引入方式层叠与继承选择器优先级CSS 选择器大全伪类与伪元素CSS 盒模型Display 与定位Flexbox 弹性布局Grid 网格布局字体与文本颜色与背景变换与过渡CSS 动画自定义属性(变量)响应式设计现代 CSS 特性最佳实践 一、什么是 CSS CSS(Cascading S


【宇树机器人强化学习】(二):ActorCritic网络和ActorCriticRecurrent网络的python实现与解析
zh路西法2026/3/17

前言 Unitree RL GYM 是一个开源的 基于 Unitree 机器人强化学习(Reinforcement Learning, RL)控制示例项目,用于训练、测试和部署四足机器人控制策略。该仓库支持多种 Unitree 机器人型号,包括 Go2、H1、H1_2 和 G1。仓库地址 本系列将着手解析整个仓库的核心代码与算法实现和训练教程。此系列默认读者拥有一定的强化学习基础和代码基础,故在部分原理和基础代码逻辑不做解释,对强化学习基础感兴趣的读者可以阅读我的入门系列: 第一期


Git Worktree / Worktrunk:并行 AI 开发工作流实战
RickeyBoy2026/3/9

最近在日常开发中尝试了用 Git Worktree (Worktrunk) 配合 Claude Code 进行并行开发,体验下来效果非常好。这篇文章就来分享一下这套工作流的搭建和使用经验,希望能对大家有点帮助~ 欢迎大家点个 star:Github 以及下载我的独立 app: iColors 一、为什么需要 Git Worktree 先说一个日常开发中很常见的场景:你正在开发一个新功能,突然来了一个紧急 bug 需要修复。通常你要么 git stash,要么 git commit 一个半成品


在OrangePi-5 Plus/5 Ultra上实时运行yolo26进行无人机检测,fps超50!
吃素的力2026/3/1

在OrangePi-5 Plus/5 Ultra上使用VideoPipe与YOLO26n实现高性能无人机检测 视频效果展示 RK3588无人机检测 前言 随着低空经济的快速发展,无人机检测已成为安防监控、边境巡逻、关键区域保护等场景中的重要需求。OrangePi 5 Plus和OrangePi 5 Ultra作为瑞芯微RK3588平台的高性能开发板,凭借其强大的NPU算力,成为边缘端AI推理的理想选择。 本文将详细介绍如何基于VideoPipe框架,结合最新的Y


花 200 美刀买“黑盒”?Claude Code 这波更新,把程序员当傻子了吧…
Dcs2026/2/21

有些产品吧,功能再强,只要开始“藏事儿”,程序员的雷达立马就响了: 你到底读了哪个文件?你到底搜了啥?你到底改了啥?——别跟我说“别管细节,反正我很聪明”。哥们,工程不是玄学,是可验证、可追溯、可复盘。 然后,Claude Code 2.1.20 就真把这事做了:把“读取文件路径”和“搜索 pattern”这种最基础的可观测信息,直接干没了。 1)更新前 vs 更新后:从“可审计”变成“随缘”🤡 以前你会看到它读了哪些文件、搜了什么关键词,属于那种一眼就能判断它有没有跑偏的“低噪音透明输出”

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读