.NET MVC之ActionResult
ActionResult是所有Controler返回值的父類。各種結果都是由ActionResult包裝后發往客戶端的。
繼承結構
從基層結構上來划分,基本上可以分為四類。視圖類、文本類、文件類和狀態碼類。
視圖類返回結果
先從我們最熟悉的視圖類來說起。View()與PartialView()它們分別返回ViewResult和PartialViewResult。從我們第一次接觸到.NET MVC開始就在用。作用就是將處理好的數據交給視圖引擎(如果有的話),來渲染視圖。
| 返回值 | 幫助方法 | 描述 |
|---|---|---|
| ViewResult |
View |
渲染一個網頁視圖 |
| PartialViewResult |
PartialView |
渲染一個網頁視圖,但不使用布局頁 |
一般我們為每個action創建的視圖都是部分視圖,里面只包含了一個網頁中的一部分。View()在渲染完視圖后會將結果嵌入在布局頁中,返回網頁的全部,而PartialView()在渲染完之后就直接將結果發送給了客戶端。
文本類返回結果
| 返回值 | 幫助方法 | 描述 |
|---|---|---|
| ContentResult |
Content |
返回一段字符串文本,文本的內容格式用戶可通過MIME指定 |
| JsonResult |
Json |
將數據序列化成JSON,之后返回給客戶端 |
| JavaScriptResult |
JavaScript |
返回一段JavaScript格式的字符串 |
Content()
使用Content()方法和直接返回一個string字符串沒什么區別,只不過你可以通過Content()指定一下返回內容的格式(XML或HTML等)與字符編碼。
- public string Content()
- {
- return "<h1>HelloKitty</h1>"; //瀏覽器顯示 HelloKitty
- }
- public ActionResult Content2()
- {
- //return Content("<h1>GoodbyeKitty</h1>"); //瀏覽器顯示 GoodbyeKitty
- //指定返回文本的格式與字符編碼
- return Content("<h1>GoodbyeKitty</h1>", "text/html",System.Text.Encoding.UTF8);
- }
- //效果都是一樣的
Json()
傳入一個任意類型的對象,盡可能地將它格式化為JSON格式。我試過基本上任何類型的對象都可以進行格式化,只不過對於文件或圖片這類東西格式化之后只是一大堆沒用的亂碼。
普遍來說,Dictionary這種鍵值對類型會被轉換成js類,List這類會被轉換成js數組。
- class Student
- {
- public string Name { get; set; }
- public int Age { get; set; }
- }
- public ActionResult JSON1()
- {
- var array = new List<Student>();
- array.Add(new Student { Name = "小明", Age = 12 });
- array.Add(new Student { Name = "小李", Age = 15 });
- return Json(array,JsonRequestBehavior.AllowGet); //JsonRequestBehavior用於指定是否允許GET方式訪問,默認只允許POST
- //運行結果:[{"Name":"小明","Age":12},{"Name":"小李","Age":15}]
- }
- public ActionResult JSON2()
- {
- //也可使用匿名內部類來保存數據
- return Json(new { name = "test", age = 16, sex = "boy" }, JsonRequestBehavior.AllowGet);
- //運行結果:{"name":"test","age":16,"sex":"boy"}
- }
JavaScript()
JavaScript()直接返回一個JavaScript代碼字符串。JavaScript()的效果實際上和Content()是一樣的,只不過JavaScript()會自動指定返回文本的內容是application/x-javascript。
- public ActionResult JS()
- {
- return JavaScript("alert('" + DateTime.Now.ToLongTimeString() + "')");
- }
- public ActionResult JS2()
- {
- return Content("alert('" + DateTime.Now.ToLongTimeString() + "')", "application/x-javascript");
- //這樣寫效果和上面完全是一樣的
- }
- /*
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <script src="http://localhost:5695/home/js2"></script>
- <!--可以直接在script標簽中填寫action的地址-->
- </head>
- <body></body>
- </html>
- */
文件類返回結果
Controler中可以用於返回文件的方法也就只有File()。File()可以通過多種形式來發送文件,可以通過文件名、二進制Byte[]、Stream流。發送時還需要通過MIME標明一下文件類型。
- public ActionResult FILE1()
- {
- System.IO.Stream fs = System.IO.File.OpenRead(@"test.png");
- return File(fs, @"image/png"); //通過流的方法
- }
- public ActionResult FILE2()
- {
- return File(@"test.png", @"image/png"); //通過文件名的方式
- }
- public ActionResult FILE3()
- {
- System.Drawing.Bitmap b = new System.Drawing.Bitmap(100, 100); //創建一張空白圖片
- System.IO.MemoryStream ms = new System.IO.MemoryStream();
- b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
- byte[] bytes = ms.GetBuffer();
- return File(bytes, @"image/bmp"); //通過二進制數據的方式
- }
- /*
- //現在可以直接將地址賦值給img標簽來進行顯示了
- <img src="http://localhost:5695/home/file1" alt="">
- */
注意:返回的文件不要太大,否則會造成內存溢出。如果要下載大文件,最好就直接返回文件地址。
實現防盜鏈
如果只是簡單的返回一個文件就太沒有意思了。通過控制器來返回文件相對於直接將文件地址給用戶而言,我們可以進行一些處理操作,比如只允許登陸過的用戶查看此圖片,或者在圖片上添加水印。
- public ActionResult FILE1()
- {
- if (HttpContext.User.Identity.IsAuthenticated)
- //如果用戶登錄了才顯示圖片
- return File(@"test.png", @"image/png");
- else
- //沒有登錄就顯示一張防盜鏈圖片
- return File(@"test.png", @"image/png");
- }
實現驗證碼
通過動態生成一張圖片返回給客戶端。具體步驟可以參考我這篇博文.NET MVC 驗證碼。
狀態碼類返回結果
| 返回值 | 幫助方法 | 描述 |
|---|---|---|
| RedirectResult |
Redirect |
返回一個HTTP 302狀態碼,使客戶端瀏覽器跳轉到指定的URL |
| RedirectToRouteResult |
RedirectToAction |
返回一個HTTP 302狀態碼,使客戶端瀏覽器跳轉到指定的action |
| RedirectToRouteResult |
RedirectToRoute |
跳轉到指定的URL,這取決於路由API |
| HttpStatusCodeResult |
(None) |
返回一個特定的HTTP 狀態碼與描述 |
| HttpUnauthorizedResult |
(None) |
返回一個HTTP 401狀態碼,提示用戶未登錄 |
| HttpNotFoundResult |
HttpNotFound |
返回一個HTTP 404狀態碼,提示用戶訪問的資源不存在 |
| EmptyResult |
(None) |
返回一個HTTP 200狀態碼表示請求成功,但不包含任何信息 |
如果action返回結果為null,Controler會自動將null替換為EmptyResult。
