.NET MVC之ActionResult


.NET MVC之ActionResult

ActionResult是所有Controler返回值的父類。各種結果都是由ActionResult包裝后發往客戶端的。

繼承結構

從基層結構上來划分,基本上可以分為四類。視圖類文本類文件類狀態碼類

視圖類返回結果

先從我們最熟悉的視圖類來說起。View()PartialView()它們分別返回ViewResultPartialViewResult。從我們第一次接觸到.NET MVC開始就在用。作用就是將處理好的數據交給視圖引擎(如果有的話),來渲染視圖。

返回值 幫助方法 描述
ViewResult
View
渲染一個網頁視圖
PartialViewResult
PartialView
渲染一個網頁視圖,但不使用布局頁

一般我們為每個action創建的視圖都是部分視圖,里面只包含了一個網頁中的一部分。View()在渲染完視圖后會將結果嵌入在布局頁中,返回網頁的全部,而PartialView()在渲染完之后就直接將結果發送給了客戶端。

文本類返回結果

返回值 幫助方法 描述
ContentResult
Content
返回一段字符串文本,文本的內容格式用戶可通過MIME指定
JsonResult
Json
將數據序列化成JSON,之后返回給客戶端
JavaScriptResult
JavaScript
返回一段JavaScript格式的字符串

Content()

使用Content()方法和直接返回一個string字符串沒什么區別,只不過你可以通過Content()指定一下返回內容的格式(XML或HTML等)與字符編碼

  1. public string Content()
  2. {
  3. return "<h1>HelloKitty</h1>"; //瀏覽器顯示 HelloKitty
  4. }
  5. public ActionResult Content2()
  6. {
  7. //return Content("<h1>GoodbyeKitty</h1>"); //瀏覽器顯示 GoodbyeKitty
  8. //指定返回文本的格式與字符編碼
  9. return Content("<h1>GoodbyeKitty</h1>", "text/html",System.Text.Encoding.UTF8);
  10. }
  11. //效果都是一樣的

Json()

傳入一個任意類型的對象,盡可能地將它格式化為JSON格式。我試過基本上任何類型的對象都可以進行格式化,只不過對於文件或圖片這類東西格式化之后只是一大堆沒用的亂碼。

普遍來說,Dictionary這種鍵值對類型會被轉換成js類List這類會被轉換成js數組

  1. class Student
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. }
  6. public ActionResult JSON1()
  7. {
  8. var array = new List<Student>();
  9. array.Add(new Student { Name = "小明", Age = 12 });
  10. array.Add(new Student { Name = "小李", Age = 15 });
  11. return Json(array,JsonRequestBehavior.AllowGet); //JsonRequestBehavior用於指定是否允許GET方式訪問,默認只允許POST
  12. //運行結果:[{"Name":"小明","Age":12},{"Name":"小李","Age":15}]
  13. }
  14. public ActionResult JSON2()
  15. {
  16. //也可使用匿名內部類來保存數據
  17. return Json(new { name = "test", age = 16, sex = "boy" }, JsonRequestBehavior.AllowGet);
  18. //運行結果:{"name":"test","age":16,"sex":"boy"}
  19. }

JavaScript()

JavaScript()直接返回一個JavaScript代碼字符串。JavaScript()的效果實際上和Content()是一樣的,只不過JavaScript()會自動指定返回文本的內容是application/x-javascript

  1. public ActionResult JS()
  2. {
  3. return JavaScript("alert('" + DateTime.Now.ToLongTimeString() + "')");
  4. }
  5. public ActionResult JS2()
  6. {
  7. return Content("alert('" + DateTime.Now.ToLongTimeString() + "')", "application/x-javascript");
  8. //這樣寫效果和上面完全是一樣的
  9. }
  10. /*
  11. <!DOCTYPE html>
  12. <html lang="en">
  13. <head>
  14. <meta charset="UTF-8">
  15. <script src="http://localhost:5695/home/js2"></script>
  16. <!--可以直接在script標簽中填寫action的地址-->
  17. </head>
  18. <body></body>
  19. </html>
  20. */

文件類返回結果

Controler中可以用於返回文件的方法也就只有File()File()可以通過多種形式來發送文件,可以通過文件名、二進制Byte[]Stream流。發送時還需要通過MIME標明一下文件類型。

  1. public ActionResult FILE1()
  2. {
  3. System.IO.Stream fs = System.IO.File.OpenRead(@"test.png");
  4. return File(fs, @"image/png"); //通過流的方法
  5. }
  6. public ActionResult FILE2()
  7. {
  8. return File(@"test.png", @"image/png"); //通過文件名的方式
  9. }
  10. public ActionResult FILE3()
  11. {
  12. System.Drawing.Bitmap b = new System.Drawing.Bitmap(100, 100); //創建一張空白圖片
  13. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  14. b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
  15. byte[] bytes = ms.GetBuffer();
  16. return File(bytes, @"image/bmp"); //通過二進制數據的方式
  17. }
  18. /*
  19. //現在可以直接將地址賦值給img標簽來進行顯示了
  20. <img src="http://localhost:5695/home/file1" alt="">
  21. */

注意:返回的文件不要太大,否則會造成內存溢出。如果要下載大文件,最好就直接返回文件地址。

實現防盜鏈

如果只是簡單的返回一個文件就太沒有意思了。通過控制器來返回文件相對於直接將文件地址給用戶而言,我們可以進行一些處理操作,比如只允許登陸過的用戶查看此圖片,或者在圖片上添加水印。

  1. public ActionResult FILE1()
  2. {
  3. if (HttpContext.User.Identity.IsAuthenticated)
  4. //如果用戶登錄了才顯示圖片
  5. return File(@"test.png", @"image/png");
  6. else
  7. //沒有登錄就顯示一張防盜鏈圖片
  8. return File(@"test.png", @"image/png");
  9. }

實現驗證碼

通過動態生成一張圖片返回給客戶端。具體步驟可以參考我這篇博文.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM