【ASP.NET MVC系列】淺談ASP.NET MVC八大類擴展(上篇)

来源:https://www.cnblogs.com/wangjiming/archive/2018/05/14/9032414.html
-Advertisement-
Play Games

lASP.NET MVC系列文章 【01】淺談Google Chrome瀏覽器(理論篇) 【02】淺談Google Chrome瀏覽器(操作篇)(上) 【03】淺談Google Chrome瀏覽器(操作篇)(下) 【04】淺談ASP.NET框架 【05】淺談ASP.NET MVC運行過程 【06】淺 ...


lASP.NET MVC系列文章

【01】淺談Google Chrome瀏覽器(理論篇)

【02】淺談Google Chrome瀏覽器(操作篇)(上)

【03】淺談Google Chrome瀏覽器(操作篇)(下)

【04】淺談ASP.NET框架   

【05】淺談ASP.NET MVC運行過程    

【06】淺談ASP.NET MVC 控制器   

【07】淺談ASP.NET MVC 路由   

【08】淺談ASP.NET MVC 視圖 

【09】淺談ASP.NET MVC 視圖與控制器傳遞數據

【10】淺談jqGrid 在ASP.NET MVC中增刪改查     

【11】淺談ASP.NET 頁面之間傳值的幾種方式

【12】淺談緩存技術在ASP.NET中的運用       

【13】淺談NuGet在VS中的運用      

【14】淺談ASP.NET 程式發佈過程           

【15】淺談數據註解和驗證           

【16】淺談依賴註入

【17】淺談表單和HTML輔助方法

【18】淺談基於APS.NET身份驗證

【19】淺談ASP.NET MVC 模型

【20】淺談ASP.NET MVC 單元測試

【21】淺談ASP.NET MVC網路安全;

【22】淺談ASP.NET MVC八大類擴展

【23】再談ASP.NET MVC Routing

【24】淺談ASP.NET 高級話題

【25】淺談大型ASP.NET MVC項目(含DEMO)

【26】下一系列:ASP.NET WebAPI


一    引入背景

       我們知道,MVC基架為我們提供了很多基礎類,當需要使用時,只需調用即可,以ActionResult為例,其有很多子類,如ContentResult,EmptyResult,FileResult,HttpStatusCodeResult,JavaScriptResult,JsonResult,RedirectResult,RedirectToRouteResult,ViewResultBase,FileContentResult,FilePathResult,FileStreamResult,ViewResult,PartialResult,

然而,儘管MVC基架提供了眾多類供我們調用,但卻並不是包括所有功能的類,比如,我需要返回XML格式的數據,或下載CSV格式的數據,此時,MVC基架就沒提供相應的類。因此,MVC類的擴展就迫在眉睫了。

      在本篇文章中,主要講解MVC比較核心的八大擴展類,一共分為兩篇,即淺談ASP.NET MVC八大類擴展(上篇)和淺談ASP.NET MVC八大類擴展(下篇)。

      其中,本篇文章主要講解MVC基架提供的ActionResult及其子孫類,自定義擴展XMLResult和CsvResult,下篇文章將講解剩下的七大類自定義擴展:Filter擴展,RazorViewEngine擴展,HtmlHelper擴展,Validator擴展,ModelBinder擴展,ControllerFactory註入擴展,Lambda 樹擴展。

 

二   ASP.NET MVC擴展概述

     但凡涉及到架構,我們首先都會關心安全性,穩定性,可擴展性等特征,當然,ASO.NET MVC也不例外,MVC之所以比WebForm流行,不僅僅在於其實現前後端的松耦合,而且其也支持強大的自定義擴展,在本篇文章中,我們就是運用MVC支持自定義擴展這一特性來進行自定義擴展,從而實現個性化項目需求。

三    代碼實例

(一) ActionResult擴展

1 AtionResult內置擴展

ASP.NET MVC提供瞭如下內置擴展類.

1.1  上圖簡要概述

(1)ActionResult類繼承Object類;

(2)ContentResult,EmptyResult,FileResult,HttpStatusCodeResult,JavaScriptResult,JsonResult,ViewResultBase,RedirectToRouteResult,RedirectResult 九大類繼承類ActionResult;

(3)FileContentResult,FilePathResult,FileStreamResult  三大類繼承類FileResult;

(4)ViewResult,PartialViewResult兩大類繼承類ViewResultBase;

1.2 ActionResult講解

功能:封裝一個操作方法的結果並用於代表該操作方法執行框架級操作。

在Mvc中,我們對如下代碼再熟悉不過了。

public ActionResult Index()
 {
    return View();
}

F12查看ActionResult定義

 1 namespace System.Web.Mvc
 2 {
 3     //
 4     // 摘要:
 5     //     表示操作方法的結果。
 6     public abstract class ActionResult
 7     {
 8         //
 9         // 摘要:
10         //     初始化 System.Web.Mvc.ActionResult 類的新實例。
11         protected ActionResult();
12 
13         //
14         // 摘要:
15         //     通過從 System.Web.Mvc.ActionResult 類繼承的自定義類型,啟用對操作方法結果的處理。
16         //
17         // 參數:
18         //   context:
19         //     用於執行結果的上下文。上下文信息包括控制器、HTTP 內容、請求上下文和路由數據。
20         public abstract void ExecuteResult(ControllerContext context);
21     }
22 }
View Code

不難看出,ActionResult具有如下特征:

(1)抽象類;

(2)一個只可繼承的構造函數;

(3)一個未實現的抽象方法;

1.2.1  ContentResult講解

功能:表示用戶定義的內容類型,該類型是操作方法的結果。

定義:查看定義

不難看出,ContentResult具有如下特征:

(1)繼承自類ActionResult

(2)包含一個構造方法,一個重寫ActionResultl類的抽象方法ExecuteResult(ControllerContext context),和三個屬性;

(3)完整定義

 1 public class ContentResult : ActionResult
 2 {
 3     // Methods
 4     public override void ExecuteResult(ControllerContext context)
 5     {
 6         if (context == null)
 7         {
 8             throw new ArgumentNullException("context");
 9         }
10         HttpResponseBase response = context.HttpContext.Response;
11         if (!string.IsNullOrEmpty(this.ContentType))
12         {
13             response.ContentType = this.ContentType;
14         }
15         if (this.ContentEncoding != null)
16         {
17             response.ContentEncoding = this.ContentEncoding;
18         }
19         if (this.Content != null)
20         {
21             response.Write(this.Content);
22         }
23     }
24 
25     // Properties
26     public string Content { get; set; }
27 
28     public Encoding ContentEncoding { get; set; }
29 
30     public string ContentType { get; set; }
31 }
32 
33  
View Code

(4)我們來看看具體例子:

如我們向頁面輸出“Alan_beijing”,可採取如下兩種方式。

方式一:

1 public ContentResult ContextResultTest()
2 {
3    return Content("Alan_beijing");
4 }

測試結果

 

方式二

1 public ContentResult ContextResultTest()
2         {
3             //string str =  "<html>" + "<head></head>" + "<body>" + "Alan_beijing" + "</body>" + "</html>";
4             string str = "<html><head></head></body>Alan_beijing</body></html>";
5             return Content(str);
6         }
View Code

測試結果

 

 

總之,大家在使用時,可以把ContentResult當作Responce.Write()使用。

 

 1.2.2  EmptyResult

功能:表示一個不執行任何操作的結果,如不返回任何內容的控制器操作方法。

 (1)查看定義

(2)完整定義

 1 public class EmptyResult : ActionResult
 2 {
 3     // Fields
 4     private static readonly EmptyResult _singleton = new EmptyResult();
 5 
 6     // Methods
 7     public override void ExecuteResult(ControllerContext context)
 8     {
 9     }
10 
11     // Properties
12     internal static EmptyResult Instance =>
13         _singleton;
14 }
View Code

(3)總結

EmptyResult不執行任何操作,相當於如下功能。

1 public ContentResult ContextResultTest()
2 {
3    return Content("");
4 }

 

1.2.3  FileResult

功能:表示一個用於將二進位文件內容發送到響應的基類。

 (1)查看定義

 

 

 

 

 (2)完整定義

  1 public abstract class FileResult : ActionResult
  2 {
  3     // Fields
  4     private string _fileDownloadName;
  5 
  6     // Methods
  7     protected FileResult(string contentType)
  8     {
  9         if (string.IsNullOrEmpty(contentType))
 10         {
 11             throw new ArgumentException(MvcResources.Common_NullOrEmpty, "contentType");
 12         }
 13         this.ContentType = contentType;
 14     }
 15 
 16     public override void ExecuteResult(ControllerContext context)
 17     {
 18         if (context == null)
 19         {
 20             throw new ArgumentNullException("context");
 21         }
 22         HttpResponseBase response = context.HttpContext.Response;
 23         response.ContentType = this.ContentType;
 24         if (!string.IsNullOrEmpty(this.FileDownloadName))
 25         {
 26             string headerValue = ContentDispositionUtil.GetHeaderValue(this.FileDownloadName);
 27             context.HttpContext.Response.AddHeader("Content-Disposition", headerValue);
 28         }
 29         this.WriteFile(response);
 30     }
 31 
 32     protected abstract void WriteFile(HttpResponseBase response);
 33 
 34     // Properties
 35     public string ContentType { get; private set; }
 36 
 37     public string FileDownloadName
 38     {
 39         get => 
 40             (this._fileDownloadName ?? string.Empty);
 41         set
 42         {
 43             this._fileDownloadName = value;
 44         }
 45     }
 46 
 47     // Nested Types
 48     internal static class ContentDispositionUtil
 49     {
 50         // Fields
 51         private const string HexDigits = "0123456789ABCDEF";
 52 
 53         // Methods
 54         private static void AddByteToStringBuilder(byte b, StringBuilder builder)
 55         {
 56             builder.Append('%');
 57             int num = b;
 58             AddHexDigitToStringBuilder(num >> 4, builder);
 59             AddHexDigitToStringBuilder(num % 0x10, builder);
 60         }
 61 
 62         private static void AddHexDigitToStringBuilder(int digit, StringBuilder builder)
 63         {
 64             builder.Append("0123456789ABCDEF"[digit]);
 65         }
 66 
 67         private static string CreateRfc2231HeaderValue(string filename)
 68         {
 69             StringBuilder builder = new StringBuilder("attachment; filename*=UTF-8''");
 70             foreach (byte num in Encoding.UTF8.GetBytes(filename))
 71             {
 72                 if (IsByteValidHeaderValueCharacter(num))
 73                 {
 74                     builder.Append((char) num);
 75                 }
 76                 else
 77                 {
 78                     AddByteToStringBuilder(num, builder);
 79                 }
 80             }
 81             return builder.ToString();
 82         }
 83 
 84         public static string GetHeaderValue(string fileName)
 85         {
 86             foreach (char ch in fileName)
 87             {
 88                 if (ch > '\x007f')
 89                 {
 90                     return CreateRfc2231HeaderValue(fileName);
 91                 }
 92             }
 93             ContentDisposition disposition = new ContentDisposition {
 94                 FileName = fileName
 95             };
 96             return disposition.ToString();
 97         }
 98 
 99         private static bool IsByteValidHeaderValueCharacter(byte b)
100         {
101             if ((0x30 <= b) && (b <= 0x39))
102             {
103                 return true;
104             }
105             if ((0x61 <= b) && (b <= 0x7a))
106             {
107                 return true;
108             }
109             if ((0x41 <= b) && (b <= 90))
110             {
111                 return true;
112             }
113             switch (b)
114             {
115                 case 0x3a:
116                 case 0x5f:
117                 case 0x7e:
118                 case 0x24:
119                 case 0x26:
120                 case 0x21:
121                 case 0x2b:
122                 case 0x2d:
123                 case 0x2e:
124                     return true;
125             }
126             return false;
127         }
128     }
129 }
View Code

1.2.4  HttpStatusCodeResult

功能:提供一種用於返回帶特定 HTTP 響應狀態代碼和說明的操作結果的方法。

(1)定義

 (2)完整定義

 1 public class HttpStatusCodeResult : ActionResult
 2 {
 3     // Methods
 4     public HttpStatusCodeResult(int statusCode) : this(statusCode, null)
 5     {
 6     }
 7 
 8     public HttpStatusCodeResult(HttpStatusCode statusCode) : this(statusCode, null)
 9     {
10     }
11 
12     public HttpStatusCodeResult(int statusCode, string statusDescription)
13     {
14         this.StatusCode = statusCode;
15         this.StatusDescription = statusDescription;
16     }
17 
18     public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription) : this((int) statusCode, statusDescription)
19     {
20     }
21 
22     public override void ExecuteResult(ControllerContext context)
23     {
24         if (context == null)
25         {
26             throw new ArgumentNullException("context");
27         }
28         context.HttpContext.Response.StatusCode = this.StatusCode;
29         if (this.StatusDescription != null)
30         {
31             context.HttpContext.Response.StatusDescription = this.StatusDescription;
32         }
33     }
34 
35     // Properties
36     public int StatusCode { get; private set; }
37 
38     public string StatusDescription { get; private set; }
39 }
View Code

 

 1.2.5 JavaScriptResult

功能:將 JavaScript 內容發送到響應。

 (1)定義

 (2)完整定義

 1 public class JavaScriptResult : ActionResult
 2 {
 3     // Methods
 4     public override void ExecuteResult(ControllerContext context)
 5     {
 6         if (context == null)
 7         {
 8             throw new ArgumentNullException("context");
 9         }
10         HttpResponseBase response = context.HttpContext.Response;
11         response.ContentType = "application/x-javascript";
12         if (this.Script != null)
13         {
14             response.Write(this.Script);
15         }
16     }
17 
18     // Properties
19     public string Script { get; set; }
20 }
View Code

 

1.2.6  JsonResult

功能:表示一個類,該類用於將 JSON 格式的內容發送到響應。

(1)定義

(2)完整定義

 1 public class JsonResult : ActionResult
 2 {
 3     // Methods
 4     public JsonResult()
 5     {
 6         this.JsonRequestBehavior = JsonRequestBehavior.DenyGet;
 7     }
 8 
 9     public override void ExecuteResult(ControllerContext context)
10     {
11         if (context == null)
12         {
13             throw new ArgumentNullException("context");
14         }
15         if ((this.JsonRequestBehavior == JsonRequestBehavior.DenyGet) && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
16         {
17             throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
18         }
19         HttpResponseBase response = context.HttpContext.Response;
20         if (!string.IsNullOrEmpty(this.ContentType))
21         {
22             response.ContentType = this.ContentType;
23         }
24         else
25         {
26             response.ContentType = "application/json";
27         }
28         if (this.ContentEncoding != null)
29         {
30             response.ContentEncoding = this.ContentEncoding;
31         }
32         if (this.Data != null)
33         {
34             JavaScriptSerializer serializer = new JavaScriptSerializer();
35             if (this.MaxJsonLength.HasValue)
36             {
37                 serializer.MaxJsonLength = this.MaxJsonLength.Value;
38             }
39             if (this.RecursionLimit.HasValue)
40             {
41                 serializer.RecursionLimit = this.RecursionLimit.Value;
42             }
43             response.Write(serializer.Serialize(this.Data));
44         }
45     }
46 
47     // Properties
48     public Encoding ContentEncoding { get; set; }
49 
50     public string ContentType { get; set; }
51 
52     public object Data { get; set; }
53 
54     public JsonRequestBehavior JsonRequestBehavior { get; set; }
55 
56     public int? MaxJsonLength { get; set; }
57 
58     public int? RecursionLimit { 
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 編程問題中相當大的一部分都可以通過使用順序編程來解決。 對於某些問題,如果能夠並行地執行程式中的多個部分,則會變得非常方便。 並行編程可以使程式執行速度得到極大地提高。 當並行執行的任務彼此開始產生互相干涉時,實際的併發問題就會接踵而至。 Web伺服器經常包含多個處理器,而併發是充分利用這些處理器的 ...
  • 手冊里可能有寫,但不是特別清晰,在這給個實例,有兩種方式: 1.多個入口文件: 將public下的index.php複製一份,粘貼、重命名為對應模塊的名字,如admin: 編輯admin.php的內容,修改模塊綁定的代碼: 之後訪問方式就是'功能變數名稱/admin.php',沒有映射功能變數名稱就是'localh ...
  • 一. Java多線程: Java給多線程編程提供了內置的支持。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。 多線程是多任務的一種特別的形式,但多線程使用了更小的資源開銷。 這裡定義和線程相關的另一個術語--進程:一個進程包括由操作系統分配的記憶體空 ...
  • jenkins中集成commander應用 jenkins 集成測試 promotion 公司的應用較多,所以需要瞭解這幾種應用在jenkins中如何做構建,我自己參與的有兩種commander的應用,一種是大數據類的,一個是我們服務端架構組的scala應用 1、大數據應用BigData 配置如下: ...
  • 1、說一說Servlet的生命周期? Servlet有良好的生存期的定義,包括載入和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet介面的init(),service()和destroy方法表達。 Servlet被伺服器實例化後,容器運行其init方法,請 ...
  • "回到 DirectX11 使用Windows SDK來進行開發" "DirectX Tool Kit下載" DirectX Tool Kit是一個包含許多類的集合,用於為公共Windows平臺編寫Direct3D 11 C++代碼。裡面包含如下可用的頭文件(基本上都在名稱空間DirectX中): ...
  • 瞭解 "structc https://github.com/wangzhione/structc" structc 是 C 構建基礎項目框架. 不是太驚艷, 但絕對是 C 簡單項目中一股清流. 它的前身是 simplec 框架. "simplec https://github.com/wangzh ...
  • STM32F103C8T6工程模板 https://pan.baidu.com/s/1jAgJQCUmFg7NtpX5bOkCWQ STM32F103ZET6工程模板 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...