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

lASP.NET MVC系列文章javascript

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

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

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

【04】淺談ASP.NET框架   web

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

【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 { get; set; }
59 }
View Code

(3)總結

JsonResult首先將指定的對象序列化爲Json字符串,而後將字符串寫入到HTTP輸出流。

 

 1.2.7 RedirectResult

功能:經過重定向到指定的 URI 來控制對應用程序操做的處理。

(1)定義

 (2)完整定義

 1 public class RedirectResult : ActionResult
 2 {
 3     // Methods
 4     public RedirectResult(string url) : this(url, false)
 5     {
 6     }
 7 
 8     public RedirectResult(string url, bool permanent)
 9     {
10         if (string.IsNullOrEmpty(url))
11         {
12             throw new ArgumentException(MvcResources.Common_NullOrEmpty, "url");
13         }
14         this.Permanent = permanent;
15         this.Url = url;
16     }
17 
18     public override void ExecuteResult(ControllerContext context)
19     {
20         if (context == null)
21         {
22             throw new ArgumentNullException("context");
23         }
24         if (context.IsChildAction)
25         {
26             throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);
27         }
28         string url = UrlHelper.GenerateContentUrl(this.Url, context.HttpContext);
29         context.Controller.TempData.Keep();
30         if (this.Permanent)
31         {
32             context.HttpContext.Response.RedirectPermanent(url, false);
33         }
34         else
35         {
36             context.HttpContext.Response.Redirect(url, false);
37         }
38     }
39 
40     // Properties
41     public bool Permanent { get; private set; }
42 
43     public string Url { get; private set; }
44 }
View Code

 

1.2.8 RedirectToRouteResult

功能:表示使用指定的路由值字典來執行重定向的結果。

(1)定義

 (2)完整定義

 1 public class RedirectToRouteResult : ActionResult
 2 {
 3     // Fields
 4     private RouteCollection _routes;
 5 
 6     // Methods
 7     public RedirectToRouteResult(RouteValueDictionary routeValues) : this(null, routeValues)
 8     {
 9     }
10 
11     public RedirectToRouteResult(string routeName, RouteValueDictionary routeValues) : this(routeName, routeValues, false)
12     {
13     }
14 
15     public RedirectToRouteResult(string routeName, RouteValueDictionary routeValues, bool permanent)
16     {
17         this.Permanent = permanent;
18         this.RouteName = routeName ?? string.Empty;
19         this.RouteValues = routeValues ?? new RouteValueDictionary();
20     }
21 
22     public override void ExecuteResult(ControllerContext context)
23     {
24         if (context == null)
25         {
26             throw new ArgumentNullException("context");
27         }
28         if (context.IsChildAction)
29         {
30             throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);
31         }
32         string str = UrlHelper.GenerateUrl(this.RouteName, null, null, this.RouteValues, this.Routes, context.RequestContext, false);
33         if (string.IsNullOrEmpty(str))
34         {
35             throw new InvalidOperationException(MvcResources.Common_NoRouteMatched);
36         }
37         context.Controller.TempData.Keep();
38         if (this.Permanent)
39         {
40             context.HttpContext.Response.RedirectPermanent(str, false);
41         }
42         else
43         {
44             context.HttpContext.Response.Redirect(str, false);
45         }
46     }
47 
48     // Properties
49     public bool Permanent { get; private set; }
50 
51     public string RouteName { get; private set; }
52 
53     internal RouteCollection Routes
54     {
55         get
56         {
57             if (this._routes == null)
58             {
59                 this._routes = RouteTable.Routes;
60             }
61             return this._routes;
62         }
63         set
64         {
65             this._routes = value;
66         }
67     }
68 
69     public RouteValueDictionary RouteValues { get; private set; }
70 }
View Code

 

 1.2.9  ViewResultBase

 功能:表示一個用於爲視圖提供模型並向響應呈現視圖的基類。

(1)定義

(2)完整定義

  1 public abstract class ViewResultBase : ActionResult
  2 {
  3     // Fields
  4     private DynamicViewDataDictionary _dynamicViewData;
  5     private TempDataDictionary _tempData;
  6     private ViewDataDictionary _viewData;
  7     private ViewEngineCollection _viewEngineCollection;
  8     private string _viewName;
  9 
 10     // Methods
 11     protected ViewResultBase()
 12     {
 13     }
 14 
 15     public override void ExecuteResult(ControllerContext context)
 16     {
 17         if (context == null)
 18         {
 19             throw new ArgumentNullException("context");
 20         }
 21         if (string.IsNullOrEmpty(this.ViewName))
 22         {
 23             this.ViewName = context.RouteData.GetRequiredString("action");
 24         }
 25         ViewEngineResult result = null;
 26         if (this.View == null)
 27         {
 28             result = this.FindView(context);
 29             this.View = result.View;
 30         }
 31         TextWriter output = context.HttpContext.Response.Output;
 32         ViewContext viewContext = new ViewContext(context, this.View, this.ViewData, this.TempData, output);
 33         this.View.Render(viewContext, output);
 34         if (result != null)
 35         {
 36             result.ViewEngine.ReleaseView(context, this.View);
 37         }
 38     }
 39 
 40     protected abstract ViewEngineResult FindView(ControllerContext context);
 41 
 42     // Properties
 43     public object Model =>
 44         this.ViewData.Model;
 45 
 46     public TempDataDictionary TempData
 47     {
 48         get
 49         {
 50             if (this._tempData == null)
 51             {
 52                 this._tempData = new TempDataDictionary();
 53             }
 54             return this._tempData;
 55         }
 56         set
 57         {
 58             this._tempData = value;
 59         }
 60     }
 61 
 62     public IView View { get; set; }
 63 
 64     [Dynamic]
 65     public object ViewBag
 66     {
 67         [return: Dynamic]
 68         get
 69         {
 70             Func<ViewDataDictionary> viewDataThunk = null;
 71             if (this._dynamicViewData == null)
 72             {
 73                 if (viewDataThunk == null)
 74                 {
 75                     viewDataThunk = () => this.ViewData;
 76                 }
 77                 this._dynamicViewData = new DynamicViewDataDictionary(viewDataThunk);
 78             }
 79             return this._dynamicViewData;
 80         }
 81     }
 82 
 83     public ViewDataDictionary ViewData
 84     {
 85         get
 86         {
 87             if (this._viewData == null)
 88             {
 89                 this._viewData = new ViewDataDictionary();
 90             }
 91             return this._viewData;
 92         }
 93         set
 94         {
 95             this._viewData = value;
 96         }
 97     }
 98 
 99     public ViewEngineCollection ViewEngineCollection
100     {
101         get => 
102             (this._viewEngineCollection ?? ViewEngines.Engines);
103         set
104         {
105             this._viewEngineCollection = value;
106         }
107     }
108 
109     public string ViewName
110     {
111         get => 
112             (this._viewName ?? string.Empty);
113         set
114         {
115             this._viewName = value;
116         }
117     }
118 }
View Code

 

1.2.10  FileContentResult

功能:將二進制文件的內容發送到響應

定義:

 1 public class FileContentResult : FileResult
 2 {
 3     // Methods
 4     public FileContentResult(byte[] fileContents, string contentType) : base(contentType)
 5     {
 6         if (fileContents == null)
 7         {
 8             throw new ArgumentNullException("fileContents");
 9         }
10         this.FileContents = fileContents;
11     }
12 
13     protected override void WriteFile(HttpResponseBase response)
14     {
15         response.OutputStream.Write(this.FileContents, 0, this.FileContents.Length);
16     }
17 
18     // Properties
19     public byte[] FileContents { get; private set; }
20 }
View Code

 

1.2.11  FilePathResult

功能:將文件的內容發送到響應。

定義:

 1 public class FilePathResult : FileResult
 2 {
 3     // Methods
 4     public FilePathResult(string fileName, string contentType) : base(contentType)
 5     {
 6         if (string.IsNullOrEmpty(fileName))
 7         {
 8             throw new ArgumentException(MvcResources.Common_NullOrEmpty, "fileName");
 9         }
10         this.FileName = fileName;
11     }
12 
13     protected override void WriteFile(HttpResponseBase response)
14     {
15         response.TransmitFile(this.FileName);
16     }
17 
18     // Properties
19     public string FileName { get; private set; }
20 }
View Code

 

1.2.12  FilestreamResult

功能:使用Stream實例將二進制內容發送到響應。

定義:

 1 public class FileStreamResult : FileResult
 2 {
 3     // Fields
 4     private const int BufferSize = 0x1000;
 5 
 6     // Methods
 7     public FileStreamResult(Stream fileStream, string contentType) : base(contentType)
 8     {
 9         if (fileStream == null)
10         {
11             throw new ArgumentNullException("fileStream");
12         }
13         this.FileStream = fileStream;
14     }
15 
16     protected override void WriteFile(HttpResponseBase response)
17     {
18         Stream outputStream = response.OutputStream;
19         using (this.FileStream)
20         {
21             byte[] buffer = new byte[0x1000];
22             while (true)
23             {
24                 int count = this.FileStream.Read(buffer, 0, 0x1000);
25                 if (count == 0)
26                 {
27                     return;
28                 }
29                 outputStream.Write(buffer, 0, count);
30             }
31         }
32     }
33 
34     // Properties
35     public Stream FileStream { get; private set; }
36 }
View Code

 

1.2.13  ViewResult

功能:表示一個類,該類用於使用由IViewEngine對象返回的IView實例來呈現視圖。

(1)定義:

 1 public class ViewResult : ViewResultBase
 2 {
 3     // Fields
 4     private string _masterName;
 5 
 6     // Methods
 7     protected override ViewEngineResult FindView(ControllerContext context)
 8     {
 9         ViewEngineResult result = base.ViewEngineCollection.FindView(context, base.ViewName, this.MasterName);
10         if (result.View != null)
11         {
12             return result;
13         }
14         StringBuilder builder = new StringBuilder();
15         foreach (string str in result.SearchedLocations)
16         {
17             builder.AppendLine();
18             builder.Append(str);
19         }
20         throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, MvcResources.Common_ViewNotFound, new object[] { base.ViewName, builder }));
21     }
22 
23     // Properties
24     public string MasterName
25     {
26         get => 
27             (this._masterName ?? string.Empty);
28         set
29         {
30             this._masterName = value;
31         }
32     }
33 }
View Code

 

1.2.14  PartialResult

功能:表示一個用於將分部視圖發送到響應的基類。

(1)定義:

 1 public class PartialViewResult : ViewResultBase
 2 {
 3     // Methods
 4     protected override ViewEngineResult FindView(ControllerContext context)
 5     {
 6         ViewEngineResult result = base.ViewEngineCollection.FindPartialView(context, base.ViewName);
 7         if (result.View != null)
 8         {
 9             return result;
10         }
11         StringBuilder builder = new StringBuilder();
12         foreach (string str in result.SearchedLocations)
13         {
14             builder.AppendLine();
15             builder.Append(str);
16         }
17         throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, MvcResources.Common_PartialViewNotFound, new object[] { base.ViewName, builder }));
18     }
19 }
View Code

 

2  ActionResult自定義擴展

關於ActionResult的自定義擴展,知足兩個條件

(1)繼承ActionResult

(2)重寫ExecuteResult()方法

2.1  XMLResult

public class XmlResult : ActionResult
    {
        private object _data;

        public XmlResult(object data)
        {
            _data = data;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            var serializer = new XmlSerializer(_data.GetType());
            var response = context.HttpContext.Response;
            response.ContentType = "text/xml";
            serializer.Serialize(response.Output, _data);
        }
    }

Controller

public XmlResult GetEmpInfo()
        {
            EmpInfo empInfo = new EmpInfo()
            {
                Name = "Alan_beijing",
                Address = "China-ShangHai",
                Age=40
            };
            return new XmlResult(empInfo);
        }

Test Result

2.2  CsvResult

 public class CsvResult : FileResult
    {
        private IEnumerable _data;

        public CsvResult(IEnumerable data, string fileName) : base("text/csv")
        {
            _data = data;
            FileDownloadName = fileName;
        }

        protected override void WriteFile(HttpResponseBase response)
        {
            var builder = new StringBuilder();
            var strWriter = new StringWriter(builder);

            foreach (var item in _data)
            {
                var properties = item.GetType().GetProperties();
                foreach (var prop in properties)
                {
                    strWriter.Write(GetValue(item, prop.Name));
                    strWriter.Write(", ");
                }
                strWriter.WriteLine();
            }

            response.Write(builder);
        }

        public static string GetValue(object item, string propName)
        {
            return item.GetType().GetProperty(propName).GetValue(item, null).ToString() ?? "";
        }
    }

 

Controller

 public CsvResult DownCsvEmpInfo()
        {
            EmpInfo empInfo = new EmpInfo()
            {
                Name = "Alan_beijing",
                Address = "China-ShangHai",
                Age = 40
            };
            return new CsvResult(new List<EmpInfo>() { empInfo }, "empInfo");
        }

 

測試結果

 

 四   推薦網址

【01】https://msdn.microsoft.com/zh-cn/library/system.web.mvc.actionresult(v=vs.118).aspx

 

五  後續

敬請等待下一篇......

 六  服務區

有喜歡的朋友,能夠看一下,不喜歡的的朋友,勿噴,謝謝!!

相關文章
相關標籤/搜索