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
繁體地址,請注明出處:http://hk.pswp.cn/web/83033.shtml
英文地址,請注明出處:http://en.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…