Microsoft前后端不分离编程新风向:cshtml
文章目录
- 什么是CSHTML?
- 基础语法
- 内联表达式
- 代码块
- 控制结构
- 布局页面
- _ViewStart.cshtml
- _Layout.cshtml
- 使用布局
- 模型绑定
- 强类型视图
- 模型集合
- HTML辅助方法
- 基本表单
- 验证
- 局部视图
- 创建局部视图
- 使用局部视图
- 高级特性
- 视图组件
- 依赖注入
- Tag Helpers
- 性能优化
- 缓存
- 捆绑和压缩
- 安全考虑
- 防跨站请求伪造(CSRF)
- HTML编码
- 实际应用示例
- 电子商务产品页面
- 调试技巧
- 使用@functions
- 调试视图
- 最佳实践
- 结语

什么是CSHTML?
CSHTML是ASP.NET Razor视图引擎使用的文件扩展名,它是C# (CS)和HTML的混合体。这种文件类型允许开发者在HTML标记中直接嵌入C#代码,用于构建动态Web页面。CSHTML文件在服务器端处理,生成纯HTML发送到客户端浏览器。
基础语法
Razor语法是CSHTML的核心,它提供了在HTML中嵌入C#代码的简洁方式。
内联表达式
最基本的Razor语法是使用@
符号将C#表达式直接嵌入HTML:
<p>当前时间是:@DateTime.Now</p>
代码块
对于多行C#代码,可以使用代码块:
@{var greeting = "欢迎来到我们的网站!";var weekDay = DateTime.Now.DayOfWeek;
}
<h1>@greeting 今天是 @weekDay</h1>
控制结构
Razor支持常见的C#控制结构:
@if(DateTime.Now.Hour < 12)
{<p>早上好!</p>
}
else
{<p>下午好!</p>
}
循环结构示例:
<ul>
@for(int i = 1; i <= 5; i++)
{<li>项目 @i</li>
}
</ul>
布局页面
ASP.NET Razor提供了布局系统,类似于Master Page的概念,但更加灵活。
_ViewStart.cshtml
这个特殊文件定义了所有视图的默认布局:
@{Layout = "_Layout";
}
_Layout.cshtml
布局页面定义了网站的整体结构:
<!DOCTYPE html>
<html>
<head><title>@ViewBag.Title</title>@RenderSection("styles", required: false)
</head>
<body><header><h1>我的网站</h1></header><div class="content">@RenderBody()</div><footer>© @DateTime.Now.Year</footer>@RenderSection("scripts", required: false)
</body>
</html>
使用布局
在具体视图中:
@{ViewBag.Title = "主页";
}<p>这是主页内容</p>@section scripts {<script>console.log("页面加载完成");</script>
}
模型绑定
CSHTML强大的功能之一是模型绑定,可以将C#对象直接传递到视图。
强类型视图
@model MyNamespace.Models.Product<h2>@Model.Name</h2>
<p>价格: @Model.Price.ToString("C")</p>
模型集合
@model IEnumerable<MyNamespace.Models.Product><ul>
@foreach(var product in Model)
{<li>@product.Name - @product.Price.ToString("C")</li>
}
</ul>
HTML辅助方法
ASP.NET提供了许多HTML辅助方法,简化了表单创建和其他常见HTML元素的生成。
基本表单
@using(Html.BeginForm("Action", "Controller", FormMethod.Post))
{@Html.LabelFor(m => m.Name)@Html.TextBoxFor(m => m.Name)@Html.LabelFor(m => m.Price)@Html.TextBoxFor(m => m.Price)<input type="submit" value="保存" />
}
验证
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
局部视图
局部视图是可重用的视图组件。
创建局部视图
_ProductCard.cshtml
:
@model Product<div class="product-card"><h3>@Model.Name</h3><p>@Model.Description</p><span class="price">@Model.Price.ToString("C")</span>
</div>
使用局部视图
@foreach(var product in Model.Products)
{@Html.Partial("_ProductCard", product)
}
高级特性
视图组件
视图组件类似于局部视图,但包含业务逻辑:
public class ShoppingCartViewComponent : ViewComponent
{public IViewComponentResult Invoke(){var cart = GetShoppingCart();return View(cart);}
}
使用视图组件:
@await Component.InvokeAsync("ShoppingCart")
依赖注入
可以直接在视图中注入服务:
@inject IEmailService EmailService<p>联系我们: @EmailService.GetSupportEmail()</p>
Tag Helpers
ASP.NET Core引入了Tag Helpers,使HTML更加自然:
<form asp-controller="Account" asp-action="Login" method="post"><label asp-for="Email"></label><input asp-for="Email" /><span asp-validation-for="Email"></span><button type="submit">登录</button>
</form>
性能优化
缓存
<cache expires-after="@TimeSpan.FromMinutes(30)">@await Component.InvokeAsync("PopularProducts")
</cache>
捆绑和压缩
<environment include="Development"><script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development"><script src="~/js/site.min.js" asp-append-version="true"></script>
</environment>
安全考虑
防跨站请求伪造(CSRF)
<form asp-action="UpdateProfile" method="post">@Html.AntiForgeryToken()<!-- 表单内容 -->
</form>
HTML编码
Razor自动对输出进行HTML编码:
<!-- 用户输入会被自动编码 -->
<p>@userInput</p><!-- 如果需要原始HTML -->
<p>@Html.Raw(userInput)</p> <!-- 谨慎使用 -->
实际应用示例
电子商务产品页面
@model ProductDetailViewModel@section styles {<link rel="stylesheet" href="~/css/product.css" />
}<div class="product-container"><div class="product-images"><img src="@Model.MainImageUrl" alt="@Model.Name" /><div class="thumbnails">@foreach(var image in Model.AdditionalImages){<img src="@image.Url" alt="@image.AltText" />}</div></div><div class="product-details"><h1>@Model.Name</h1><div class="price">@if(Model.IsOnSale){<span class="original-price">@Model.OriginalPrice.ToString("C")</span><span class="sale-price">@Model.Price.ToString("C")</span><span class="discount">节省 @Model.DiscountPercentage.ToString("P0")</span>}else{<span>@Model.Price.ToString("C")</span>}</div><div class="rating">@for(int i = 1; i <= 5; i++){<span class="@(i <= Model.AverageRating ? "filled" : "")">★</span>}<span>(@Model.ReviewCount 条评价)</span></div><form asp-action="AddToCart" method="post" class="add-to-cart">@Html.AntiForgeryToken()<input type="hidden" asp-for="ProductId" /><div class="quantity"><label asp-for="Quantity"></label><select asp-for="Quantity">@for(int i = 1; i <= 10; i++){<option value="@i">@i</option>}</select></div><button type="submit">加入购物车</button></form><div class="product-description"><h3>产品描述</h3><p>@Html.Raw(Model.Description)</p></div></div>
</div>@section scripts {<script src="~/js/product.js"></script>
}
调试技巧
使用@functions
可以在视图中定义函数:
@functions {public string GetCssClassForRating(int star, double averageRating){return star <= averageRating ? "filled" : "";}
}
调试视图
@{// 设置断点可以调试var debugInfo = Model;
}
最佳实践
- 保持视图简单:将复杂逻辑移入控制器或服务层
- 使用强类型视图:避免使用ViewBag/ViewData
- 重用组件:利用局部视图和视图组件
- 关注安全:始终对用户输入进行验证和编码
- 优化性能:使用缓存和捆绑等技术
- 保持一致性:遵循项目约定的代码风格
结语
CSHTML作为ASP.NET Razor视图引擎的核心,提供了强大的功能来创建动态Web应用程序。从简单的内联表达式到复杂的布局系统和视图组件,它能够满足从简单到复杂的所有Web开发需求。通过遵循最佳实践并充分利用其特性,开发者可以构建出高效、安全且易于维护的Web应用程序。
掌握CSHTML需要实践和经验积累。建议从简单的页面开始,逐步尝试更复杂的特性,最终你将能够充分利用ASP.NET Razor视图引擎的全部潜力,构建出功能丰富、响应迅速的现代Web应用程序。
相关文章:

Microsoft前后端不分离编程新风向:cshtml
文章目录 什么是CSHTML?基础语法内联表达式代码块控制结构 布局页面_ViewStart.cshtml_Layout.cshtml使用布局 模型绑定强类型视图模型集合 HTML辅助方法基本表单验证 局部视图创建局部视图使用局部视图 高级特性视图组件依赖注入Tag Helpers 性能优化缓存捆绑和压缩…...

【评测】用Flux的图片文本修改的PS效果
【评测】Flux的图片文本修改的PS效果 1. 百度图库找一张有英文的图片 2. 打开https://playground.bfl.ai/image/edit上传图片 3. 输入提示词 “change brarfant to goodbeer” 图片的文字被修改了...
青少年编程与数学 01-011 系统软件简介 01 MS-DOS操作系统
青少年编程与数学 01-011 系统软件简介 01 MS-DOS操作系统 1. MS-DOS的历史背景1.1 诞生背景1.2 发展历程1.3 与Windows的关系 2. MS-DOS的技术细节2.1 系统架构2.2 启动过程2.3 内存管理2.4 设备驱动程序 3. MS-DOS的用户界面3.1 命令行界面3.2 配置文件 4. MS-DOS的应用程序与…...

数据库管理-第334期 Oracle Database 23ai测试版RAC部署文档(20250607)
数据库管理334期 2024-06-07 数据库管理-第334期 Oracle Database 23ai测试版RAC部署文档(20240607)1 环境与安装介质2 操作标准系统配置2.1 关闭防火墙2.2 关闭SELinux2.3 关闭avahi-daemon2.4 时间同步配置 3 存储服务器配置3.1 配置本地yum源3.2 安装…...
springCloud2025+springBoot3.5.0+Nacos集成redis从nacos拉配置起服务
文章目录 前言一、网关gateway选型1. 响应式编程模型2. 网关的特定需求3. 技术栈一致性4. 性能对比5. 实际应用场景优势 二、redis的集成1.引入库2.配置类A、自定义配置类RedisAfterNacosAutoConfigurationB、自定义配置类RedisConfig 总结 前言 最近在搭建最新的springCloud …...

AI生成的基于html+marked.js实现的Markdown转html工具,离线使用,可实时预览 [
有一个markdown格式的文档,手头只有notepad的MarkdownPanel插件可以预览,但是只能预览,不能直接转换为html文件下载,直接复制预览的内效果又不太好,度娘也能找到很多工具,但是都需要在线使用。所以考虑用AI…...

机器学习:load_predict_project
本文目录: 一、project目录二、utils里的两个工具包(一)common.py(二)log.py 三、src文件夹代码(一)模型训练(train.py)(二)模型预测(…...
OkHttp 3.0源码解析:从设计理念到核心实现
本文通过深入分析OkHttp 3.0源码,揭示其高效HTTP客户端的实现奥秘,包含核心设计理念、关键组件解析、完整工作流程及实用技巧。 一、引言:为什么选择OkHttp? 在Android和Java生态中,OkHttp已成为HTTP客户端的标准选择…...

【storage】
文章目录 1、RAM and ROM2、DRAM and SRAM2、Flash Memory(闪存)4、DDR and SPI NOR Flash5、eMMC6、SPI NOR vs SPI NAND vs eMMC vs SD附录——prototype and demo board附录——U盘、SD卡、TF卡、SSD参考 1、RAM and ROM RAM(Random Acce…...
微信小程序带参分享、链接功能
分享链接的功能是右上角点...然后复制链接,可以直接点击 #小程序://**商城/p5XqHti******* 这种链接直接从其他地方跳转到小程序 wx.onCopyUrl(() > {return {query: "shareCode" this.shareCode,}; }); query就是参数,直接在onload里…...

JVM 垃圾回收器 详解
垃圾收集器 SerialSerial Old:单线程回收,适用于单核CPU场景ParNewCMS:暂停时间较短,适用于大型互联网应用中与用户交互的部分Paraller ScavengeParallel Old:吞吐量高,适用于后台进行大量数据操作G1&#…...

FreeRTOS任务之深入篇
目录 1.Tick1.1 Tick的概念1.2 Tick与任务调度1.3 Tick与延时函数 2.任务状态2.1 运行状态 (Running)2.2 就绪状态 (Ready)2.3 阻塞状态 (Blocked)5.4 暂停状态 (Suspended)2.5 特殊状态:删除状态 (Deleted)5.6 任务状态转换2.7 实验 3.Delay函数3.1 两个函数3.2 实…...

Linux 系统、代码与服务器进阶知识深度解析
在数字化时代,Linux 系统凭借其开源、稳定、安全的特性,成为服务器领域和软件开发的核心支柱。除了算法优化技巧,Linux 系统在网络服务、容器化技术、服务器安全等方面也蕴含着丰富的知识和实用技术。接下来,我们将深入探讨这些领…...

人工智能--AI换脸
本文实现了一个简易的人脸交换程序,主要功能包括:1)检查所需的模型文件是否存在;2)使用预训练的Caffe模型检测图像中的人脸;3)将源图像的人脸区域通过泊松融合无缝地替换到目标图像上。程序通过OpenCV的DNN模块加载人脸检测模型&a…...

NLP学习路线图(二十七):Transformer编码器/解码器
一、Transformer概览:抛弃循环,拥抱注意力 传统RNN及其变体(如LSTM、GRU)处理序列数据时存在顺序依赖的瓶颈:必须逐个处理序列元素,难以并行计算,且对长程依赖建模能力较弱。Transformer的革命…...

【机器学习】支持向量机实验报告——基于SVM进行分类预测
目录 一、实验题目描述 二、实验步骤 三、Python代码实现基于SVM进行分类预测 四、我的收获 五、我的感受 一、实验题目描述 实验题目:基于SVM进行分类预测 实验要求:通过给定数据,使用支持向量机算法(SVM)实现分…...
策略模式实战:Spring中动态选择商品处理策略的实现
概念 可以在运行时期动态的选择需要的具体策略类,处理具体的问题 组成元素 策略接口 public interface GoodsStrategy {void handleGoods(); } 具体策略类 Service(Constants.BEAN_GOODS) public class BeanGoodsStrategy implements GoodsStrategy {Override…...
主流信创数据库对向量功能的支持对比
主流信创数据库对向量功能的支持对比 版本支持对比向量索引支持对比距离函数支持对比使用限制对比OceanBase向量数据库GaussDB向量数据库TiDB向量数据库VastBase向量数据库 ⭐️ 本文章引用数据截止于2025年5月31日。 版本支持对比 数据库产品支持向量功能的版本OceanBaseOce…...
Matlab | matlab中的画图工具详解
二维图形到高级三维可视化 **一、基础二维绘图****二、三维可视化****三、图形修饰工具****四、高级功能****五、交互式工具****六、面向对象绘图(推荐)****七、常用技巧****学习资源**在MATLAB中,画图工具(绘图功能)是其核心优势之一,涵盖从基础二维图形到高级三维可视化…...

HA: Wordy靶场
HA: Wordy 来自 <HA: Wordy ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128,靶场IP192.168.23.130 3,对靶机进行端口服务探…...
6.7本日总结
一、英语 复习默写list10list19,07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 本周结束线代第一讲和计组第二章,之后学习计网4.4,学完计网4.4之后开操作系…...

中国移动6周年!
基站超过250万个 网络规模全球最大、质量最优 覆盖全国96%人口 在全国率先实现乡乡双千兆 服务用户超5.7亿 网络上下行均值接入速率均居行业首位 行业应用快速推广,数量超5万个 3CC、RedCap、通感一体、 无线AI改造等技术成熟商用 客户品牌持续升级&#x…...
Svelte 核心语法详解:Vue/React 开发者如何快速上手?
在很多地方早就听到过svelte的大名了,不少工具都有针对svelte的配置插件,比如vite \ unocss \ svelte. 虽然还没使用过,但是发现它的star82.9k数很高哦,学习一下它与众不同的魔法。 这名字有点别扭,好几次都写错。 sve…...
Fullstack 面试复习笔记:HTML / CSS 基础梳理
Fullstack 面试复习笔记:HTML / CSS 基础梳理 之前的笔记: Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结Fullstack 面试复习笔记:项目…...

408第一季 - 数据结构 - 树与二叉树II
二叉树的先中后序遍历 理解 那主播,请问你有没有更快的遍历方式呢 有的,兄弟有的 以中序遍历为例啊 找左边有没有东西,左边没东西那它就自由了,就按上面的图举例子 A左边有东西,是B,B左边没东西…...
打卡第47天
作业:对比不同卷积层热图可视化的结果 核心差异总结 浅层卷积层(如第 1-3 层) 关注细节:聚焦输入图像的边缘、纹理、颜色块等基础特征(例:猫脸的胡须边缘、树叶的脉络)。热图特点:区…...

从上下文学习和微调看语言模型的泛化:一项对照研究
大型语言模型表现出令人兴奋的能力,但也可以从微调中表现出令人惊讶的狭窄泛化。例如,他们可能无法概括为简单的关系反转,或者无法根据训练信息进行简单的逻辑推理。这些未能从微调中概括出来的失败可能会阻碍这些模型的实际应用。另一方面&a…...

智慧城市建设方案
第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障…...
phosphobot开源程序是控制您的 SO-100 和 SO-101 机器人并训练 VLA AI 机器人开源模型
一、软件介绍 文末提供程序和源码下载 phosphobot开源程序是控制您的 SO-100 和 SO-101 机器人并训练 VLA AI 机器人开源模型。 二、Overview 概述 🕹️ Control your robot with the keyboard, a leader arm, a Meta Quest headset or via API 🕹️…...

pygame开发的坦克大战
使用Python和Pygame开发的精美坦克大战游戏。这个游戏包含玩家控制的坦克、敌方坦克、各种障碍物、爆炸效果和完整的游戏机制。 游戏说明 这个坦克大战游戏包含以下功能: 游戏特点 玩家控制:使用方向键移动坦克,空格键射击 敌人AI&#x…...