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>&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.pswp.cn/web/83033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot+SpringCloud】Linux配置nacos踩坑大全

*建议在开发时使用Linux环境下搭建nacos 1.在nacos官网找到搭配SpringBoot和SpringCloud的版本 2.Nacos 依赖 Java 环境来运行&#xff0c;需要在linux系统中安装JDK 1.8 3.按照Nacos官网步骤安装&#xff0c;防火墙配置开放8848和9848端口 客户端拥有相同的计算逻辑&…

如何在 Java 中优雅地使用 Redisson 实现分布式锁

分布式系统中&#xff0c;节点并发访问共享资源可能导致数据一致性问题。分布式锁是常见的解决方案&#xff0c;可确保操作原子性。Redisson是基于Redis的Java分布式对象库&#xff0c;提供多种分布式同步工具&#xff0c;包括分布式锁。Redisson与Redis&#xff08;实时数据平…

pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)

目录 一、SQL注入 二、搜索型注入 三、源码分析 1、渗透思路1 2、渗透思路2 四、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入百分号单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取…

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…

A Survey on the Memory Mechanism of Large Language Model based Agents

目录 摘要Abstract1. LLM-Based Agent的Memory1.1 基础概念1.2 用于解释Memory的例子1.3 智能体记忆的定义1.3.1 狭义定义(肯定不用这个定义)1.3.2 广义定义 1.4 记忆协助下智能体与环境的交互过程1.4.1 记忆写入1.4.2 记忆管理1.4.3 记忆读取1.4.4 总过程 2. 如何实现智能体记…

搭建 Serverless 架构

✅ 一、理解 Serverless 架构核心概念 核心理念&#xff1a; 无需管理服务器&#xff1a;只需编写业务逻辑&#xff0c;部署后由云平台托管运行环境。 事件驱动&#xff08;Event-driven&#xff09; 按需计费&#xff08;按调用次数/资源消耗&#xff09; 高可扩展性与自动…

Git仓库的创建

Git服务器准备 假设Git所在服务器为Ubuntu系统&#xff0c;IP地址10.17.1.5。 一. 准备运行git服务的git用户&#xff0c;这里用户名就直接设定为git。 1. 创建一个git用户组&#xff0c;并创建git用户。 sudo groupadd git sudo useradd git -g git 2. 创建git用户目录&…

电脑提示dll文件缺失怎么办 dll修复方法

当你在使用某些应用程序或启动电脑时&#xff0c;看到提示“DLL文件缺失”的错误信息&#xff0c;这通常意味着某个必要的动态链接库&#xff08;DLL&#xff09;文件无法被找到或加载&#xff0c;导致软件无法正常运行。本文将详细介绍如何排查和修复DLL文件缺失的问题&#x…

使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试

这段代码使用了 Rest-Assured 进行 API 测试&#xff0c;结合 TestNG 框架执行多个 HTTP 请求并进行断言验证。以下是对每个测试方法的详细解释&#xff0c;包括代码逻辑和测试目的。 1. test01() 方法 - 提取响应数据 Test public void test01() {String jsonData "{\&…

【设计模式-4.7】行为型——备忘录模式

说明&#xff1a;本文介绍行为型设计模式之一的备忘录模式 定义 备忘录模式&#xff08;Memento Pattern&#xff09;又叫作快照模式&#xff08;Snapshot Pattern&#xff09;或令牌模式&#xff08;Token Pattern&#xff09;指在不破坏封装的前提下&#xff0c;捕获一个对…

2025年渗透测试面试题总结-天融信[社招]渗透测试工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 天融信[社招]渗透测试工程师 一、Java Spring Boot组件漏洞 1. CVE-2018-1270&#xff08;WebSocket RCE&…

华为OD机考-内存冷热标记-多条件排序

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextInt();int[] arr new int[a];for(int…

PPT转图片拼贴工具 v3.0

软件介绍 这个软件就是将PPT文件转换为图片并且拼接起来。 这个代码支持导入单个文件也支持导入文件夹 但是目前还没有解决可视化界面问题。 效果展示 软件源码 import os import re import win32com.client from PIL import Image from typing import List, Uniondef con…

NLP学习路线图(三十):微调策略

在自然语言处理领域,预训练语言模型(如BERT、GPT、T5)已成为基础设施。但如何让这些“通才”模型蜕变为特定任务的“专家”?微调策略正是关键所在。本文将深入剖析七种核心微调技术及其演进逻辑。 一、基础概念:为什么需要微调? 预训练模型在海量语料上学习了通用语言表…

讲述我的plc自学之路 第十三章

我和lora都是那种理想主义者&#xff0c;这是我们的共同之处。但是lora比我要更文艺一些&#xff0c;她读的书毕竟比我多&#xff0c;上的又是名校。受北大人文气息的熏陶&#xff0c;她总是对爱情充满了太多幻想。 “说说你的过往吧&#xff0c;lora。”我给lora倒了一杯啤酒&…

GPU虚拟化

引言 现有如下环境&#xff08;注意相关配置&#xff1a;只有一个k8s节点&#xff0c;且该节点上只有一张GPU卡&#xff09;&#xff1a; // k8s版本 $ kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.7&…

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…

AI智能驱动浏览器工具Browser Use详解

前言 在之前关于 AI 测试相关的几篇文章中,我们分别介绍了通过 playwright-mcp,以及 midscene.js、magentic ui 等几个不同的 AI 浏览器工具,实现 AI 驱动自动化测试的方法介绍。而其实在这些不断涌现的新工具出现之前,还有一个更早推出(2024.11),也同样还在不断完善的…

新成果:GaN基VCSEL动态物理模型开发

作为高速数据传输与光电信号处理的核心器件&#xff0c;垂直腔面发射激光器&#xff08;VCSEL&#xff09;在高速光通信、激光雷达等领域应用广泛&#xff0c;其动态特性直接关联器件调制速率及稳定性等关键参数。近期&#xff0c;天津赛米卡尔科技有限公司技术团队开发了GaN基…

嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析

第一部分 移除挂起等待列表中的任务 while( listLIST_IS_EMPTY( &xPendingReadyList ) pdFALSE )//循环寻找直到为空&#xff0c;把全部任务扫描一遍 { pxTCB ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingR…