ASP.NET MVC? 入門指南四

21. 高級路由配置

21.1 自定義路由約束

除了使用默認的路由約束,你還可以創建自定義路由約束。自定義路由約束允許你根據特定的業務邏輯來決定一個路由是否匹配。例如,創建一個只允許特定年份的路由約束:

csharp

public class YearRouteConstraint : IRouteConstraint
{public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection){if (values.TryGetValue(routeKey, out object value)){if (int.TryParse(value.ToString(), out int year)){return year >= 2000 && year <= 2030;}}return false;}
}

然后在路由配置中使用這個自定義約束:

routes.MapRoute(name: "CustomYearRoute",url: "products/{year}",defaults: new { controller = "Product", action = "Index" },constraints: new { year = new YearRouteConstraint() }
);
21.2 區域路由

當應用程序變得復雜時,可以使用區域(Areas)來組織代碼。區域允許你將相關的控制器、視圖和模型分組在一起。創建一個區域的步驟如下:

  • 在項目中創建一個?Areas?文件夾。
  • 在?Areas?文件夾下創建一個新的區域文件夾,例如?Admin
  • 在?Admin?文件夾下創建?ControllersViews?和?Models?文件夾。
  • 在?Admin?文件夾下創建一個?AdminAreaRegistration.cs?文件來配置區域路由:

public class AdminAreaRegistration : AreaRegistration
{public override string AreaName{get{return "Admin";}}public override void RegisterArea(AreaRegistrationContext context){context.MapRoute("Admin_default","Admin/{controller}/{action}/{id}",new { action = "Index", id = UrlParameter.Optional });}
}

在?RouteConfig.cs?中注冊區域:

public class RouteConfig
{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 注冊區域AreaRegistration.RegisterAllAreas();routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}
}

22. 視圖組件

22.1 視圖組件的概念

視圖組件是一種輕量級的可復用視圖元素,類似于部分視圖,但功能更強大。視圖組件可以包含自己的邏輯和數據訪問代碼,并且可以異步加載。

22.2 創建視圖組件

創建一個視圖組件需要以下步驟:

  • 創建一個繼承自?ViewComponent?的類,例如:

public class LatestProductsViewComponent : ViewComponent
{private readonly ProductContext _context;public LatestProductsViewComponent(ProductContext context){_context = context;}public async Task<IViewComponentResult> InvokeAsync(){var latestProducts = await _context.Products.OrderByDescending(p => p.CreatedDate).Take(5).ToListAsync();return View(latestProducts);}
}

  • 在?Views/Shared/Components/LatestProducts?文件夾下創建一個?Default.cshtml?視圖文件:

@model IEnumerable<YourNamespace.Product><h3>最新產品</h3>
<ul>@foreach (var product in Model){<li>@product.Name</li>}
</ul>

  • 在其他視圖中使用視圖組件:

@await Component.InvokeAsync("LatestProducts")

23. 信號量與實時通信

23.1 使用 SignalR 實現實時通信

SignalR 是一個用于在服務器和客戶端之間實現實時通信的庫。可以使用 SignalR 來創建實時聊天、實時通知等功能。

  • 安裝?Microsoft.AspNetCore.SignalR?包。
  • 創建一個繼承自?Hub?的類,例如:

public class ChatHub : Hub
{public async Task SendMessage(string user, string message){await Clients.All.SendAsync("ReceiveMessage", user, message);}
}

  • 在?Startup.cs?中配置 SignalR:

public void ConfigureServices(IServiceCollection services)
{services.AddSignalR();services.AddControllersWithViews();
}public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{// 其他配置...app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");endpoints.MapHub<ChatHub>("/chatHub");});
}

  • 在客戶端使用 JavaScript 連接到 SignalR 服務器:

html

<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.1/signalr.min.js"></script>
<script>const connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();connection.on("ReceiveMessage", (user, message) => {const msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");const encodedMsg = user + " says: " + msg;const li = document.createElement("li");li.textContent = encodedMsg;document.getElementById("messagesList").appendChild(li);});connection.start().catch(err => console.error(err.toString()));document.getElementById("sendButton").addEventListener("click", event => {const user = document.getElementById("userInput").value;const message = document.getElementById("messageInput").value;connection.invoke("SendMessage", user, message).catch(err => console.error(err.toString()));event.preventDefault();});
</script>

24. 日志記錄與監控

24.1 日志記錄

在?ASP.NET?MVC 中,可以使用?Microsoft.Extensions.Logging?進行日志記錄。在?Startup.cs?中配置日志記錄:

public void ConfigureServices(IServiceCollection services)
{services.AddLogging(loggingBuilder =>{loggingBuilder.AddConsole();loggingBuilder.AddDebug();});services.AddControllersWithViews();
}

在控制器中使用日志記錄:

private readonly ILogger<ProductController> _logger;public ProductController(ILogger<ProductController> logger)
{_logger = logger;
}public ActionResult Index()
{_logger.LogInformation("訪問產品列表頁面");return View();
}
24.2 監控

可以使用 Application Insights 來監控應用程序的性能和健康狀況。在?Startup.cs?中配置 Application Insights:

public void ConfigureServices(IServiceCollection services)
{services.AddApplicationInsightsTelemetry(Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"]);services.AddControllersWithViews();
}

Application Insights 可以收集應用程序的請求數據、異常信息、性能指標等,幫助你快速發現和解決問題。

25. 微服務架構與 MVC

25.1 微服務架構概述

微服務架構是一種將應用程序拆分為多個小型、自治服務的架構模式。每個微服務都可以獨立開發、部署和擴展。

25.2 在 MVC 中集成微服務

可以將 MVC 應用程序拆分為多個微服務,每個微服務負責一個特定的業務功能。例如,將產品管理、訂單管理、用戶管理等功能拆分為獨立的微服務。可以使用 RESTful API 來實現微服務之間的通信。

// 產品微服務的控制器
[ApiController]
[Route("api/[controller]")]
public class ProductController : ControllerBase
{private readonly ProductContext _context;public ProductController(ProductContext context){_context = context;}[HttpGet]public async Task<ActionResult<IEnumerable<Product>>> GetProducts(){return await _context.Products.ToListAsync();}
}

在其他微服務中調用產品微服務的 API:

using System.Net.Http;
using System.Threading.Tasks;public class ProductService
{private readonly HttpClient _httpClient;public ProductService(HttpClient httpClient){_httpClient = httpClient;}public async Task<IEnumerable<Product>> GetAllProducts(){var response = await _httpClient.GetAsync("http://product-service/api/product");response.EnsureSuccessStatusCode();return await response.Content.ReadAsAsync<IEnumerable<Product>>();}
}

通過以上這些高級內容的學習,你可以進一步提升自己在?ASP.NET?MVC 開發方面的技能,應對更復雜的業務場景和項目需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81570.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

測試基礎筆記第十八天

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、web自動化1.xpath定位1.屬性定位2.屬性與邏輯結合3.屬性和層級結合 2.常見元素定位方法&#xff08;面試題&#xff09;3.常見元素定位失敗原因4.cookie1.驗證碼…

(筆記)List

一、List的介紹和使用 1.List的介紹 1.1 list是可以在任意常數范圍內插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。 1.2 list底層是雙向鏈表結構&#xff0c;雙向鏈表中每個元素都儲存在互不相關的獨立節點中&#xff0c;在節點中通過指針指向前其前一個…

重載和覆寫有什么區別?

重載&#xff08;Overload&#xff09;和覆寫&#xff08;Override&#xff0c;也叫重寫 &#xff09;是面向對象編程中的重要概念&#xff0c;它們有以下區別&#xff1a; 定義 - 重載&#xff1a;在同一類中&#xff0c;允許存在多個方法名相同&#xff0c;但參數列表&#x…

flask 獲取各種請求數據:GET form-data x-www-form-urlencoded JSON headers 上傳文件

在 Flask 里&#xff0c;能使用多種方法獲取不同類型的請求數據&#xff0c;下面詳細介紹常見請求數據的獲取方式。 獲取查詢字符串參數&#xff08;GET 請求&#xff09; 查詢字符串參數一般在 URL 里&#xff0c;以 ?key1value1&key2value2 這種形式存在。可通過 requ…

人工智能助力工業制造:邁向智能制造的未來

在當今數字化轉型的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技術正逐漸成為推動工業制造領域變革的核心力量。智能制造作為工業 4.0 的重要組成部分&#xff0c;通過將 AI 技術與傳統制造工藝深度融合&#xff0c;正在重塑整個生產流程&#xff0c;提高生產效率、…

【java八股文】深入淺出synchronized優化原理

&#x1f50d; 開發者資源導航 &#x1f50d;&#x1f3f7;? 博客主頁&#xff1a; 個人主頁&#x1f4da; 專欄訂閱&#xff1a; JavaEE全棧專欄 synchronized優化原理 synchronized即使悲觀鎖也是樂觀鎖&#xff0c;擁有自適應性。 jvm內部會統計每個鎖的競爭激烈程度&…

生成式 AI 的重要性

在科技飛速發展的今天,我們正站在一個前所未有的變革節點上。生成式 AI,宛如一顆突然劃破夜空的耀眼流星,以其強大的創造力和無限的可能性,迅速成為全球矚目的焦點。它究竟有何等魔力,能在如此短的時間內引發如此巨大的轟動?這背后又隱藏著怎樣的時代密碼,等待著我們去解…

生成式 AI 的闡釋

在科技浪潮的洶涌推動下,一個全新的時代正以前所未有的速度向我們奔來,生成式 AI 無疑是這股浪潮中最耀眼的浪尖。它究竟是什么?又將如何重塑我們的世界?這不僅是科技愛好者們熱衷探討的話題,更是關乎每一個人未來發展的重要命題。 生成式 AI,從本質上來說,是一種能夠自…

C++ 中 virtual 的作用

文章目錄 1. 用于虛繼承2. 用于抽象基類3. 用于多態 C 的 virtual 關鍵字&#xff0c;常見有 3 種用途&#xff1a;虛繼承、抽象基類和多態。 1. 用于虛繼承 virtual 用于虛繼承時&#xff0c;主要是為了解決菱形繼承中的重復繼承同名成員問題。使用形式如下 class Derived:…

軟件測試52講學習分享:深入理解單元測試

課程背景 最近我在學習極客時間的《軟件測試52講》課程&#xff0c;這是由騰訊TEG基礎架構部T4級專家茹炳晟老師主講的認證課程。作為數字化轉型與人工智能(DTAI)產業人才基地建設中心的認證課程&#xff0c;內容非常專業實用。今天想和大家分享第3講"什么是單元測試&…

Java SE(7)——類和對象(二)

1.包(package) 1.1 包的定義 在Java中&#xff0c;包是一種用于組織和管理類&#xff0c;接口和其他包的機制。主要作用是防止命名沖突&#xff0c;并提供一種訪問控制機制 1.2 package關鍵字 package關鍵字的主要作用是聲明當前類在哪個包里面。 當然&#xff0c;用戶也可以…

Manus聯合創始人:公司產品基于Claude和阿里千問大模型開發

3月11日消息&#xff0c;日前&#xff0c;Manus官方在社交平臺轉發了公司聯合創始人、首席科學家季逸超對Manus的技術解讀&#xff0c;季逸超在評論區回復網友關于“Manus使用了哪一個基礎大模型”這一問題時回復稱&#xff0c;“我們用過Claude&#xff0c;也用過不同版本的Qw…

欺騙單頁應用(SPA)渲染隱藏路由 -- trouble at the spa b01lersCTF

題目信息&#xff1a;I had this million-dollar app idea the other day, but I can’t get my routing to work! I’m only using state-of-the-art tools and frameworks, so that can’t be the problem… right? Can you navigate me to the endpoint of my dreams? 題目…

大數據引領行業革命:深度解析與未來趨勢

??個人主頁??:慌ZHANG-CSDN博客 ????期待您的關注 ???? 在信息化、數字化、智能化日益發展的今天,大數據技術已經成為推動產業變革的重要引擎。它不僅僅是一個技術工具,更是各行各業創新和優化的核心動力。無論是大企業還是初創公司,大數據的應用已經成為提升效…

[machine learning] Transformer - Attention (二)

本文介紹帶訓練參數的self-attention&#xff0c;即在transformer中使用的self-attention。 首先引入三個可訓練的參數矩陣Wq, Wk, Wv&#xff0c;這三個矩陣用來將詞向量投射(project)到query, key, value三個向量上。下面我們再定義幾個變量&#xff1a; import torch inpu…

施磊老師rpc(三)

文章目錄 mprpc框架項目動態庫編譯框架生成動態庫框架初始化函數-文件讀取1. 為什么要傳入 argc, argv2. 讀取參數邏輯3. 配置文件設計 init部分實現 mprpc配置文件加載(一)配置文件加載類成員變量主要方法**src/include/mprpcconfig.h** 配置文件**bin/test.conf** 實現配置文…

文獻分享:通過簡單的生物偶聯策略將肽雙特異性抗體(pBsAbs)應用于免疫治療

背景 雙特異性抗體是將單克隆抗體的兩個不同抗原結合位點融合成一個單一實體的人工分子。它們已經成為一種很有前景的下一代抗癌治療方法。盡管雙特異性抗體的應用令人著迷&#xff0c;但雙特異性抗體的設計和生產仍然繁瑣而富有挑戰性&#xff0c;導致研發過程漫長&#xff0…

二、shell腳本--變量與數據類型

1. 變量的定義與使用 定義變量&#xff1a;簡單直接 在 Shell 里定義變量相當容易&#xff1a; 基本格式: variable_namevalue關鍵點 ?&#xff1a;賦值號 的兩邊絕對不能有空格&#xff01;這絕對是初學者最容易踩的坑之一 &#x1f628;&#xff0c;務必留意&#xff01…

java_Lambda表達式

1、背景 lambda表達式是Java SE 8中一個重要的新特性。lambda表達式允許你通過表達式來代替功能接口。lambda表達式就和方法一樣樣&#xff0c;它提供了一個正常的參數列表和一個使用這些參數的主體&#xff08;body&#xff0c;可以是一個表達式和一個代碼塊&#xff09;。La…

給QCustomPlot添加一個QScrollBar滾動條、限制縮放范圍、自動設置大小和右邊欄垂直縮放

實現效果 實現思路 從QCustomPlot類派生一個類,進行個性化設置,在軸矩形的上邊設置Margin,放一個滾動條,設置滾動條的樣式 常量定義 #define NQSCRB 1000構造函數初始化 // 設置QScrollBar的樣式// 頂部空--5,左側空--6