1. 程式人生 > >瞭解ASP.NET MVC幾種ActionResult的本質:JavaScriptResult & JsonResult

瞭解ASP.NET MVC幾種ActionResult的本質:JavaScriptResult & JsonResult

在之前的兩篇文章(《EmptyResult & ContentResult》和《FileResult》)我們剖析了EmptyResult、ContentResult和FileResult這三種ActionResult是如何將Action執行的結果響應給客戶端的。本篇文章著重介紹在進行Ajax呼叫中經常使用的兩個ActionResult,即JavaScriptResult和JsonResult。[本文已經同步到《How ASP.NET MVC Works?》中]

目錄
一、JavaScriptResult
二、例項演示:通過JavaScriptResult返回欄位在客戶端自動執行的JavaScript
三、JsonResult

一、JavaScriptResult

JavaScriptResult使我們可以在服務端動態地生成一段JavaScript指令碼,並以此作為請求的響應,而這段指令碼會在客戶端被執行。其實JavaScriptResult的實現非常簡單,它僅僅是將表示JavaScript指令碼的字串通過當前的HttpResponse響應給請求的客戶端而已。如下面的程式碼片斷所示,JavaScriptResult的屬性Script表示響應的JavaScript指令碼,而用於響應JavaScript指令碼的ExecuteResult方法除了將指令碼內容寫入當前HttpResponse之外,還會將響應的媒體型別設定為“application/x-javascript

”(不是“text/javascript”)。

   1: public class JavaScriptResult : ActionResult
   2: {
   3:     public override void ExecuteResult(ControllerContext context)
   4:     {        
   5:         HttpResponseBase response = context.HttpContext.Response;
   6:
response.ContentType = "application/x-javascript";
   7:         response.Write(this.Script);
   8:     }
   9:     public string Script { get; set; }
  10: }
  11:  
  12: public abstract class Controller : ControllerBase, ...
  13: {
  14:     //其他成員
  15:     protected virtual JavaScriptResult JavaScript(string script);
  16: }

抽象類Controller中定義瞭如上一個JavaScript方法根據指定的指令碼字串建立一個JavaScriptResult。實際上我們完全可以通過ContentResult來實現與JavaScriptResult一樣的指令碼響應功能,下面的兩段程式是等效的。大部分瀏覽器會將媒體型別“application/x-javascript”等同於“text/javascript”,所以在通過ContentResult進行指令碼響應時將媒體型別設定為“text/javascript”可以起到相同的效果。返回型別為JavaScriptResult的Action方法一般用於處理Ajax請求。

   1: //JavaScriptResult:
   2: public class FooController : Controller
   3: {
   4:     public ActionResult JavaScript()
   5:     {
   6:         return JavaScript("alert('Hello World!');");
   7:     }
   8: }
   9:  
  10: //ContentResult:
  11: public class FooController : Controller
  12: {
  13:     public ActionResult JavaScript()
  14:     {
  15:         return Content("alert('Hello World!');", "application/x-javascript");
  16:     }
  17: }

二、例項演示:通過JavaScriptResult返回欄位在客戶端自動執行的JavaScript

我們照例演示一個通過JavaScriptResult進行指令碼響應的例子。我們演示一個線上購物的場景:用於完成了商品選購之後提交訂單,服務端在處理訂單的時候需要確認訂購的商品是否超出了對應的庫存量,如果存量充裕則正常處理該訂單,否則提示庫存不足,並將商品實時庫存量顯示給使用者讓他修正相應商品的購買量。我們利用JavaScript的方式來提示訂單處理結果的訊息(成功處理或者庫存不足),很顯然這段JavaScript應該是動態的(庫存量是動態的)。

在通過Visual Studio的ASP.NET MVC專案模板建立的空Web應用中定義一個ShoppingCart類表示購物車。如下面的程式碼片斷所示,ShoppingCart是表示購物車商品項ShoppingCartItem物件的列表,而ShoppingCartItem的三個屬性(Id、Name和Quantity)分別表示商品ID、名稱和訂購數量。

   1: public class ShoppingCart : List<ShoppingCartItem>
   2: {}
   3:  
   4: public class ShoppingCartItem
   5: {
   6:     public string     Id { get; set; }
   7:     public string     Name { get; set; }
   8:     public int        Quantity { get; set; }
   9: }

然後我們建立如下一個HomeController。我們在預設的Action方法Index中建立一個包含三個商品的ShoppingCart物件,並將其作為Model呈現在對應的View中。Action方法ProcessOrder用於處理提交的購買訂單,如果訂購商品的數量沒有超過庫存量(通過一個靜態字典欄位stock表示),則通過呼叫alert函式提示“購物訂單成功處理”,否則提示“庫存不足”,並將相應商品當前庫存量顯示出來。

   1: public class HomeController : Controller
   2: {
   3:     private static Dictionary<string, int> stock = new Dictionary<string, int>();
   4:     static HomeController()
   5:     {
   6:         stock.Add("001", 20);
   7:         stock.Add("002", 30);
   8:         stock.Add("003", 40);
   9:     }
  10:     public ActionResult Index()
  11:     {
  12:         ShoppingCart cart = new ShoppingCart();
  13:         cart.Add(new ShoppingCartItem { Id = "001", Quantity=1, Name = "商品A" });
  14:         cart.Add(new ShoppingCartItem { Id = "002", Quantity = 1, Name = "商品B" });
  15:         cart.Add(new ShoppingCartItem { Id = "003", Quantity = 1, Name = "商品C" });
  16:         return View(cart);
  17:     }
  18:         
  19:     public ActionResult ProcessOrder(ShoppingCart cart)
  20:     {
  21:         StringBuilder sb = new StringBuilder();
  22:         foreach (var cartItem in cart)
  23:         {
  24:             if (!CheckStock(cartItem.Id, cartItem.Quantity))
  25:             {
  26:                 sb.Append(string.Format("{0}: {1};", cartItem.Name,stock[cartItem.Id]));
  27:             }
  28:         }
  29:         if(string.IsNullOrEmpty(sb.ToString()))
  30:         {
  31:             return Content("alert('購物訂單成功處理!');", "text/javascript");
  32:         }
  33:         string script = string.Format("alert('庫存不足! ({0})');", sb.ToString().TrimEnd(';'));
  34:         return JavaScript(script); 
  35:     }
  36:  
  37:     private bool CheckStock(string id, int quantity)
  38:     {
  39:         return stock[id] >= quantity;
  40:     }
  41: }

如下所示的是Action方法Index對應的View的定義,這是一個Model型別為ShoppingCart的強型別View。在一個以Ajax請求提交的表單(表單的Action屬性對應著上面定義的Action方法ProcessOrder)中顯示了購物車中的商品和數量,用於可以修改訂購數量並通過點選“提交訂單”按鈕以Ajax請求的方式提交訂單。

   1: @model ShoppingCart
   2: <html>
   3:     <head>
   4:         <title>使用者登入</title>
   5:         <script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.6.2.js")"></script>
   1:         <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")">
</script>
   6:     </head>
   7:     <body>
   8:         @using (Ajax.BeginForm("ProcessOrder", new AjaxOptions()))
   9:         {
  10:             for (int i = 0; i < Model.Count; i++)
  11:             {         
  12:                 <div>
  13:                     @Html.HiddenFor(m=>m[i].Id)
  14:                     @Html.HiddenFor(m => m[i].Name)
  15:  
  16:                     @Html.DisplayFor(m => m[i].Name):
  17:                     @Html.EditorFor(m => m[i].Quantity)
  18:                 </div>
  19:             }
  20:             <input type="submit" value="提交訂單" />
  21:         }
  22:     </body>
  23: </html>

執行我們的程式後,一個包含三個商品的購物車資訊會被呈現出來,當我們輸入相應的訂購數量並點選“提交訂單”後,訂單處理結果訊息會彈出來。下圖所示的就是庫存不足的情況下顯示的訊息。

image

相關推薦

瞭解ASP.NET MVCActionResult本質EmptyResult & ContentResult

定義在Controller中的Action方法大都返回一個ActionResult物件。ActionResult是對Action執行結果的封裝,用於最終對請求進行響應。ASP.NET MVC提供了一系列的ActionResult,它們本質上是通過怎樣的方式來響應請求的呢?這是這個系列著重討論的主題。[

瞭解ASP.NET MVCActionResult本質FileResult

FileResult是一個基於檔案的ActionResult,利用FileResult我們可以很容易地將從某個物理檔案的內容響應給客戶端。ASP.NET MVC定義了三個具體的FileResult,分別是FileContentResult、FilePathResult和FileStreamResult。在這篇

瞭解ASP.NET MVCActionResult本質JavaScriptResult & JsonResult

在之前的兩篇文章(《EmptyResult & ContentResult》和《FileResult》)我們剖析了EmptyResult、ContentResult和FileResult這三種ActionResult是如何將Action執行的結果響應給客戶端的。本篇文章著重介紹在進行Ajax呼叫中經常

瞭解ASP.NET MVCActionResult本質HttpStatusCodeResult & RedirectResult/RedirectToRouteResult

在本系列的最後一篇,我們來討論最後三個ActionResult:HttpStatusCodeResult、RedirectResult和RedirectToRouteResult 。第一個用於實現針對某個HTTP狀態的響應,而後兩個用於實現重定向。至於重定向,又分為“暫時重定向”和“永久重定向”,按照響應狀態

asp.net MVC繫結下拉列表的寫法

今天寫寫在asp.net MVC中幾種繫結下拉列表的寫法。 1.在前端寫死資料: @Html.DropDownListFor(m=>m.Sex,new SelectList(new List&l

MVC學習系列-WebForm與asp.net MVC設計模式區別、MVC設計模式基礎瞭解

ASP.NET 是一個開發框架,用於通過 HTML、CSS、JavaScript 以及伺服器指令碼來構建網頁和網站。ASP.NET 支援三種開發模式:Web Pages、MVC (Model View Controller) 以及 WebForm。下面首先區別比較一下Web

【翻譯】瞭解ASP.NET MVC的HTML助手

作者:Shailendra Chauhan works as Software Analyst at reputed MNC and has more than 5 years of hand over Microsoft .NET technologies. He is a

Asp.net檔案下載方式

C# code ASP.NET檔案下載 //TransmitFile實現下載 protected void Button1_Click(object sender, EventArgs e) { /* 微軟為Response

ASP.NET MVC常用ActionResult

一、定義 MVC中ActionResult是Action的返回結果。ActionResult 有多個派生類,每個子類功能均不同,並不是所有的子類都需要返回檢視View,有些直接返回流,有些返回字串等。ActionResult是一個抽象類,它定義了唯一的ExecuteResult方法,引數為一個C

ASP.NET MVC 提高運行速度的性能優化方法

服務 排隊 等待 谷歌搜索 部署 lan str run 提高 主要介紹ASP.NETMVC 應用提速的六種方法,因為沒有人喜歡等待,所以介紹幾種常用的優化方法。 大家可能會遇到排隊等待,遇到紅燈要等待,開個網頁要等待,等等等。 理所當然,沒有人喜歡等待網頁慢吞吞地加載

asp.net MVC html.ActionLink的參數格式

class cti span 生成 get 傳遞 文字 targe classname 一 Html.ActionLink("linkText","actionName") 該重載的第一個參數是該鏈接要顯示的文字,第二個參數是對應的控制器的方法, 默認控制器為當前頁面的控制

ASP.NET MVC下自定義錯誤頁和展示錯誤頁的方式

提供服務 one url attribute 運行 16px execute 釋放 namespace 在網站運行中,錯誤是不可避免的,錯誤頁的產生也是不可缺少的。 這幾天看了博友的很多文章,自己想總結下我從中學到的和實際中配置的。 首先,需要知道產生錯誤頁的來源,一種

asp.net MVC從後端傳遞資料到前端的資料形式:ViewBag,ViewData,Model

參考:https://blog.csdn.net/xiaouncle/article/details/77825389 在以上文章的基礎上做點相關補充。 1.ViewBag是一個動態欄位,而ViewData是一個字典 首先看後臺程式碼: public ActionResult T

ASP.NET MVC 檔案上傳和檔案下載 以及 檔案下載的方法

1、序言最近專案中需要用到這個功能點,但是網上下載的時候總是出現亂碼。所以趁著這個時間自己整理出了一份,以後需要的時候就直接看自己的部落格就行了。已經測試過:在谷歌、火狐、IE等瀏覽器上都不會出現亂碼問題。2、結果展示2.1、上傳檔案成功介面 2.2、下載檔案成功介面3、上傳

asp.net MVC前臺View頁面向後臺Controller控制器傳遞資料的方式

上一篇文章Asp.Net MVC中的@model與Model講解了後臺控制器如何向前臺頁面傳遞資料,今天就接著為大家講解前臺View頁面向後臺Controller控制器傳遞資料的幾種方式。這幾種方式是我在實際中使用並總結的,如果那個地方說的不對或有不足之處,歡迎各位指出並給

asp.net mvcActionResult

new 特殊 包含 string 工作 json數據 value orm none Web服務器接收到一個客戶端請求以後,會對請求予以相應,而這個響應是通過Response來控制的, 但是在asp.net mvc 裏,這部分的工作是由ActionResult來完成的,

ASP.NET MVC中有四過濾器類型

std tpc min fsm emc 為什麽 lbp yun eal 在ASP.NET MVC中有四種過濾器類型 Action 1、在ASP.NET MVC項目中,新建文件夾Filter,然後新建類MyCustormFilter,繼承自ActionFilterA

如何在asp.net mvc中添加自定義的HTML輔助方法

步驟 gen 其他 generic url linq build mode 擴展方法 很久沒在博客園發表文章了,今天來總結一下如何在asp.net mvc中添加自定義的HTML輔助方法。我們現在設計這麽一個目前,利用自定義的HTML方法來渲染一個普通的img標記。直接進入主

ASP.NET MVC Filters 4默認過濾器的使用【附示例】

rac model 指定 host 會話 決策 蜘蛛 formate 操作性 過濾器(Filters)的出現使得我們可以在ASP.NET MVC程序裏更好的控制瀏覽器請求過來的URL,不是每個請求都會響應內容,只響應特定內容給那些有特定權限的用戶,過濾器理論上有以下功能:

Asp.Net MVC及Web API框架配置會碰到的個問題及解決方案(轉)

erb his 控制 NPU vat types ror 控制器 動手 前言 剛開始創建MVC與Web API的混合項目時,碰到好多問題,今天拿出來跟大家一起分享下。有朋友私信我問項目的分層及文件夾結構在我的第一篇博客中沒說清楚,那麽接下來我就準備從這些文件怎麽分文件夾說起