欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Asp.Net MVC——控制器與動作(Controller And Action)

 更新時(shí)間:2017年03月03日 14:33:49   作者:SeeYouBug  
這篇文章主要介紹了詳解Asp.Net MVC——控制器與動作(Controller And Action) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

一、理解控制器

1.1、什么是控制器

控制器是包含必要的處理請求的.NET類,控制器的角色封裝了應(yīng)用程序邏輯,控制器主要是負(fù)責(zé)處理請求,實(shí)行對模型的操作,選擇視圖呈現(xiàn)給用戶。

簡單理解:實(shí)現(xiàn)了IController接口,修飾符必須是public,不能是抽象的,不能是泛型的,類名必須以Controller結(jié)尾。

在MVC框架中,控制器類必須實(shí)現(xiàn)System.Web.Mvc命名空間下的IController接口,如上圖所示,這是一個(gè)非常簡單的接口,該接口僅有一個(gè)Execute方法,當(dāng)請求該控制器時(shí)Execute方法被調(diào)用。通過實(shí)現(xiàn)IController接口,你可以創(chuàng)建控制器類。

1.2、控制器的作用

a、每一個(gè)針對應(yīng)用程序的請求,都是通過控制器自由地選擇合適的方式來處理的,只要它不偏離到視圖(View)和模型(Model)所負(fù)責(zé)的區(qū)域。

b、不要把業(yè)務(wù)或數(shù)據(jù)存儲的邏輯放到控制器里面,也不要?jiǎng)?chuàng)建用戶接口。

1.3、創(chuàng)建實(shí)現(xiàn)IController接口的控制器

示例: 創(chuàng)建一個(gè)實(shí)現(xiàn)Icontroller接口的類,讀取路由數(shù)據(jù),并生成數(shù)據(jù)寫入響應(yīng)。

在Controllers文件夾下創(chuàng)建一個(gè)名為MyFirstController的類,實(shí)現(xiàn)IController接口并添加如下代碼

運(yùn)行該應(yīng)用程序并在地址欄導(dǎo)航到/MyFirst,便可以看到此控制器產(chǎn)生的輸出。

創(chuàng)建一個(gè)類通過實(shí)現(xiàn)IController接口,MVC框架會將其視為一個(gè)控制器,并將請求發(fā)送給它,而且在如何處理和響應(yīng)請求上沒有任何限制,這是一個(gè)很好的示例,因?yàn)樗蚰阏故玖薓VC框架的可擴(kuò)展性,但用這種方式編寫一個(gè)復(fù)雜的應(yīng)用程序是非常困難的。

1.4、創(chuàng)建繼承于Controller類的控制器

通過System.Web.Mvc.Controller類你可以派生你的控制器,System.Web.Mvc.Controller類是大多數(shù)Web開發(fā)人員需要熟悉的,用來對請求處理提供支持的一個(gè)類,Controller提供了以下三個(gè)關(guān)鍵特性。

(1)、動作方法(Action Method):一個(gè)控制器的行為被分解成多個(gè)方法(而并非只有唯一的Execute()方法)。每個(gè)動作方法被暴露給不同的URL,并通過從輸入請求提取的參數(shù)進(jìn)行調(diào)用。

(2)、動作結(jié)果(Action Result):你可以返回一個(gè)描述動作結(jié)果的對象(例如:渲染一個(gè)視圖,或重定向到一個(gè)不同的URL或動作方法),然后通過該對象實(shí)現(xiàn)你的目的。這種指定結(jié)果和執(zhí)行之間的分離簡化了單元測試。

(3)、過濾器(Filter):你可以把可重用的行為封裝成過濾器,然后通過在代碼中添加特性的的方式,把這種行為標(biāo)注到一個(gè)過多個(gè)控制器或動作方法上。

 除非在頭腦中有一個(gè)非常明確的需求,否則創(chuàng)建控制器最好的辦法就是通過Controller類進(jìn)行派生,這也正是你在Visual Studio中添加一個(gè)控制器,Visual Studio為你所做的事情。

在Controllers文件夾下創(chuàng)建一個(gè)名為MySecondController的類,繼承與Controller類,然后添加一個(gè)動作方法TestAction并編寫如下代碼返回一個(gè)動作結(jié)果,最后再該動作方法內(nèi)右鍵添加對應(yīng)的視圖。

運(yùn)行應(yīng)用程序并導(dǎo)航到/MySecond/TestAction瀏覽結(jié)果如下:

作為Controller類的一個(gè)派生類,所要做的工作是實(shí)現(xiàn)動作方法、獲取所需要的各種輸入,以對請求進(jìn)行處理,并生成一個(gè)適當(dāng)?shù)捻憫?yīng)。后面的內(nèi)容將介紹數(shù)據(jù)的接收與響應(yīng)。

二、控制器對數(shù)據(jù)的接收

2.1、數(shù)據(jù)來源

a、查詢字符串值 b、表單數(shù)據(jù) c、路由數(shù)據(jù)

控制器需要經(jīng)常訪問來自輸入請求的數(shù)據(jù),如查詢字符串、表單數(shù)據(jù)、以及由路由系統(tǒng)根據(jù)輸入的URL解析得到的參數(shù)的值。訪問這些數(shù)據(jù)有三種主要方式。

(1)、從上下文對象提取。

(2)、作為參數(shù)被傳遞給動作方法(Action Method)而形成的數(shù)據(jù)。

(3)、明確調(diào)用框架的模型綁定(Model Binding)功能。

注意:參數(shù)名稱是忽略大小寫的,如Request["Test"]與Request["test"]結(jié)果是一樣的。如下圖:

View部分

Controller部分

2.2、通過上下文對象獲取數(shù)據(jù)

當(dāng)創(chuàng)建一個(gè)從Controller基類派生的控制器時(shí),就能夠訪問一組非常便利的屬性,這些屬性包括:Request、Response、RouteData、HttpContext、Server等,每一個(gè)屬性都包含了請求不同方面的的信息。在Action方法里是可以使用任何Context對象來訪問這些屬性。例如:

public ActionResult Index()
    {
      string userName = User.Identity.Name;
      string serverName = Server.MachineName;
      string clientIP = Request.UserHostAddress;
      DateTime dateStamp = HttpContext.Timestamp;

      string oldProductName = Request.Form["OldName"];
      string newProductName = Request.Form["NewName"];

      ViewBag.Message = "本機(jī)的IP是:" + clientIP;
      return View();
    }

可以利用VS智能感知,在動作方法中輸入this.找到這些可用的上下文信息。

2.3、使用動作(Action)方法參數(shù)

2.3.1、使用Action方法參數(shù)

 下面的方式是不是比上面的方法更優(yōu)雅易讀呢?不過需要注意的是:Action方法里面是不允許有ref或out參數(shù)的,雖然編譯不會報(bào)錯(cuò)但運(yùn)行時(shí)會拋出一個(gè)異常。如下所示。

MySecond控制器代碼如下:

Index視圖代碼如下:

運(yùn)行結(jié)果如下:

 

2.3.2、理解參數(shù)對象實(shí)例化

Controller基類使用叫做“值提供器(Value Provider)”和“模型綁定器(Model Binder)”的MVC框架組件來獲取動作方法的參數(shù)值。值提供器將可用的數(shù)據(jù)項(xiàng)集合呈現(xiàn)給控制器。有一組內(nèi)建的值提供器從Request.For

m、Request.QueryString、Request.Files、RouteData.Values獲取數(shù)據(jù)項(xiàng),然后這些值會被傳遞給模型綁定器,模型綁定器會嘗試將這些數(shù)據(jù)映射成動作方法參數(shù)的數(shù)據(jù)類型。默認(rèn)的模型綁定能夠創(chuàng)建和填充任何.NET類型的對象,包括自定義的類型和集合。

2.3.3、理解可選參數(shù)與必須的參數(shù)

如果MVC框架找不到引用類型參數(shù)(如:string或object)的值,動作方法仍然會被調(diào)用,但對該參數(shù)會使用一個(gè)null值,若找不到值類型參數(shù)(如:int或double)的值則會拋出一個(gè)異常,并且不會調(diào)用動作方法。

a、值類型參數(shù)是必須被賦值的。如果想讓此參數(shù)和引用類型參數(shù)一樣,可以定義成int?如:public ActionResult Index(int? num),當(dāng)依然沒有值時(shí),不會發(fā)生異常,而是會傳遞null值。

b、引用類型的參數(shù)是可選的。為了使它成為必須的(保證一個(gè)非空的值被傳遞),在動作(Action)方法上添加一些代碼拒絕null。例如,在該值等于null時(shí),拋出一個(gè)ArgumentNullException異常。

2.3.4、指定默認(rèn)參數(shù)值

如果希望處理不含動作方法參數(shù)的請求,但又不想在代碼中檢查null值或拋出異常,可以使用C#的可選參數(shù)特性來代替。如下所示:

public ActionResult List(string query = "all", int page = 1)
    {
      //此處省略代碼N行...
      return View();
    }

在定義參數(shù)時(shí),通過對參數(shù)賦值的辦法,可以將參數(shù)標(biāo)記為可選的,如上訴代碼中,給query和page參數(shù)提供了默認(rèn)值。MVC框架會試圖通過請求為這些參數(shù)獲取值,但如果沒有值可用,那么將用所指定的默認(rèn)值代替。

對于string類型參數(shù)query,注意string類型是引用類型,這意味著不需要檢查null值。如果請求為指定查詢字符串,那么該動作(Action)方法將以字符串“all”進(jìn)行調(diào)用。對于int類型參數(shù),注意int類型是值類型,在沒有page值時(shí),請求不會導(dǎo)致錯(cuò)誤,該方法將以默認(rèn)值“1”進(jìn)行調(diào)用。

三、控制器對數(shù)據(jù)的響應(yīng)

3.1、理解動作結(jié)果(Action Result)

原理:

a、MVC框架接收從Action方法返回的ActionResult對象,并調(diào)用定義在ActionResult類里面ExecuteResult方法,對ActionResult進(jìn)行實(shí)現(xiàn),為我們處理Response對象并生成相關(guān)的輸出。

b、MVC框架內(nèi)置了許多ActionResult類型,都是從ActionResult類派生的,能夠方便我們在Action方法里面選擇具體的返回類型,比如要呈現(xiàn)到View,可以選擇ViewResult作為Action方法的返回值。

MVC框架含有許多內(nèi)置的動作結(jié)果類型如下圖所示,所有這些類型都是派生于ActionResult,其中在Controller類中有便利的輔助器方法。下面將解釋如何使用這些結(jié)果類型。

MVC框架支持的輸出類型有: 1.視圖 2.文本數(shù)據(jù) 3.XML數(shù)據(jù) 4.JSON數(shù)據(jù) 5.文件或者二進(jìn)制數(shù)據(jù) 6.返回錯(cuò)誤和HTTP Codes 7.定制的ActionResult 8.重定向

3.2、通過渲染視圖(View)返回HTML

最常見的來自Action方法的響應(yīng)就是生成HTML并發(fā)送給瀏覽器,為了使用動作結(jié)果(ActionResult)生成HTML,需要?jiǎng)?chuàng)建一個(gè)指定了要呈現(xiàn)的視圖ViewResult類的實(shí)例。我們在Home控制器中編寫如下代碼.代碼中指定了HomePage的視圖。

當(dāng)MVC框架調(diào)用ViewResult對象的ExecuteResult時(shí),就會開始對指定的View進(jìn)行搜素。

使用了區(qū)域(Area),則搜索順序如下:

1、/Area/<AreaName>/Views/<ControllerName>/<ViewName>.aspx

2、/Area/<AreaName>/Views/<ControllerName>/<ViewName>.ascx

3、/Area/<AreaName>/Views/Shared/<ControllerName>/<ViewName>.aspx

4、/Area/<AreaName>/Views/Shared/<ControllerName>/<ViewName>.ascx

5、/Area/<AreaName>/Views/<ControllerName>/<ViewName>.cshtml

6、/Area/<AreaName>/Views/<ControllerName>/<ViewName>.vbhtml

7、/Area/<AreaName>/Views/Shared/<ControllerName>/<ViewName>.chtml

8、/Area/<AreaName>/Views/Shared/<ControllerName>/<ViewName>.vbhtml

如果沒有使用區(qū)域(Area)或者在前面找不到則會在下面搜索,搜索順序如下:

1、/Views/<ControllerName>/<ViewName>.aspx

2、/Views/<ControllerName>/<ViewName>.ascx

3、/Views/Shared/<ControllerName>/<ViewName>.aspx

4、/Views/Shared/<ControllerName>/<ViewName>.ascx

5、/Views/<ControllerName>/<ViewName>.cshtml

6、/Views/<ControllerName>/<ViewName>.vbhtml

7、/Views/Shared/<ControllerName>/<ViewName>.chtml

8、/Views/Shared/<ControllerName>/<ViewName>.vbhtml

只要有一個(gè)視圖找到,就停止搜索,并開始將找到的視圖(View)呈現(xiàn)給客戶端。

通過路徑來指定呈現(xiàn)的視圖(View)

這種命名約定的方法非常方便和簡捷,但是它限制了我們所能呈現(xiàn)的一些視圖。如果要呈現(xiàn)一個(gè)具體的視圖,可以提供一個(gè)明確的路徑,下面是一個(gè)例子。

當(dāng)我們這樣指定一個(gè)視圖時(shí),指定的路徑必須以“/”或者“~/”并且包含擴(kuò)展名(如:.aspx)。當(dāng)然不推薦這樣來使用,因?yàn)檫@不利于程序的擴(kuò)展和維護(hù),這是一種綁定或耦合,有違MVC設(shè)計(jì)思想,可以有其他的方法來達(dá)到同樣的效果例如:使用RedirectToAction()方法。

View輔助方法

View():返回到Action同名的視圖。

View(“viewName”):返回到此控制器的ViewName視圖。

View(“~/views/othercontroller/viewname.cshtml”):這種方式必須以~/或者/開頭,但并不建議這么做,因?yàn)榭梢哉{(diào)用RedirectToAction這樣的方法。

View(“viewname”,”layout”):呈現(xiàn)這個(gè)視圖的時(shí)候,換一個(gè)母版頁。

3.3、將數(shù)據(jù)從動作(Action)方法傳遞給視圖(View)

傳輸數(shù)據(jù)的幾種方式:1.視圖模型  2.ViewData  3.ViewBag  4.TempData

3.3.1、提供視圖模型對象

將一個(gè)對象作為View方法的參數(shù)傳遞給視圖。例如:

Controller部分

public ViewResult Index2()
{
  DateTime date = DateTime.Now;
  return View(date);
}

View部分,添加視圖時(shí),選擇Razor視圖引擎。

@{ 
  ViewBag.Title = "Index2"; 
} 
<h2>Index</h2> 
The day is: @(((DateTime)Model).DayOfWeek)

上面的視圖是一個(gè)沒有類型或者說是弱類型的視圖,它不知道關(guān)于視圖模型對象的任何信息,并且將它作為object對象的實(shí)例進(jìn)行處理。為了得到DayOfWeek屬性的值,需要將object對象的實(shí)例強(qiáng)轉(zhuǎn)為DateTime,這樣做能夠?qū)崿F(xiàn)效果,但卻讓視圖變得雜亂。

我們可以通過創(chuàng)建強(qiáng)類型的View來改進(jìn),即在View里指定視圖模型對象的類型,只需要添加代碼:@model DateTime,如下所示:

@model DateTime
@{ 
  ViewBag.Title = "Index2"; 
} 
<h2>Index</h2> 
The day is: @Model.DayOfWeek

運(yùn)行結(jié)果如下:

可以發(fā)現(xiàn),使用強(qiáng)類型的視圖不僅讓視圖變得整潔,而且方便我們編碼,因?yàn)閷傩杂兄悄芨兄?。如下圖所示:

 

3.3.2、使用ViewBag傳遞數(shù)據(jù)

在前面我們已經(jīng)使用過了ViewBag視圖包這個(gè)特性,該特性允許你在一個(gè)動態(tài)對象上定義任意屬性,并能夠在視圖里面訪問。如下所示:

Controller部分

public ViewResult Index2()
    {
      ViewBag.Message = "Hello ViewBag!";
      ViewBag.Date=DateTime.Now;
      return View();
    }

View 部分

@{
  Layout = null;
}

<!DOCTYPE html>

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>Index2</title>
</head>
<body>
  <div>
    the message is:@ViewBag.message<br/>
     the day is:@ViewBag.Date.DayOfWeek
  </div>
</body>
</html>

運(yùn)行效果如下:

相對于視圖模型對象方面,ViewBag有一個(gè)優(yōu)點(diǎn),即它能夠很容易地發(fā)送多個(gè)對象到視圖。假如我們被限制只能使用視圖模型,那么為了實(shí)現(xiàn)相同的效果需要?jiǎng)?chuàng)建一個(gè)新的類型具有string和DateTime兩個(gè)類型的的成員。使用動態(tài)對象可以在視圖中輸入屬性和方法調(diào)用的任意序列。

3.3.3、使用ViewData傳遞數(shù)據(jù)

ViewData是在MVC3之前的版本中出現(xiàn)的,主要的功能類似于ViewBag,但ViewData是使用ViewDataDictionary類實(shí)現(xiàn)的而不是一個(gè)動態(tài)的類型,ViewDataDictionary類是一個(gè)常規(guī)的鍵/值對的集合,并通過Controller類的ViewData屬性訪問。如下示例:

Controller部分

public ViewResult Index2()
    {
      ViewData["message"] = "Hello ViewBag!";
      ViewData["Date"]=DateTime.Now;
      return View();
    }

View部分

public class MySecondController : Controller
  {
    public ActionResult Index()
    {
      TempData["Message"] = "Hello TempData";
      TempData["Data"] = "TempData的值只能讀取一次";
      return View();
    }
    public ActionResult TempDataTest()
    {
      return View();
    }
  }

運(yùn)行結(jié)果與VIewBag運(yùn)行結(jié)果一致。

上面的代碼中,我們看到ViewData需要對object對象進(jìn)行類型轉(zhuǎn)換,現(xiàn)在有了ViewBag以后,推薦使用ViewBag,并且盡量使用強(qiáng)類型視圖和視圖模型。

3.3.4、使用TempData傳遞數(shù)據(jù)

在【3.4.4、使用TempData保留重定向數(shù)據(jù)】節(jié)中會介紹使用TempData傳遞數(shù)據(jù),這里不作介紹。

3.4、執(zhí)行重定向

有一種動作(Action)方法的通常結(jié)果并不是直接產(chǎn)生輸出,而是把用戶的瀏覽器重定向?qū)Я硪粋€(gè)URL。大多數(shù)情況下,這個(gè)URL是應(yīng)用程序的另一個(gè)動作(Action)方法,用來生成你希望用戶看到的輸出。

重定向的Action方法不產(chǎn)生任何的輸出,只是讓瀏覽器重新請求一個(gè)其它的URL。在MVC程序中,一般會定向到其它的Action方法來產(chǎn)生輸出。

在執(zhí)行重定向時(shí),發(fā)送了兩個(gè)HTTP代碼中的一個(gè)到瀏覽器。

(1)、發(fā)送HTTP 302狀態(tài)編碼,代表暫時(shí)重定向。(常用類型)

(2)、發(fā)送HTTP 301狀態(tài)編碼,表示永久重定向。(使用需謹(jǐn)慎)

重定向的類型有:1.重定向到文本URL   2.重定向到路由系統(tǒng)的URL  3.重定向到動作(Action)方法

3.4.1、重定向到文本URL

對瀏覽器重定向最基本的方式是調(diào)用Redirect方法,它返回RedirectResult類的一個(gè)實(shí)例。如下示例:

如果希望重定的URL被表示成一個(gè)字符串,并作為參數(shù)傳遞給Redirect方法。Redirect方法發(fā)送的是一個(gè)臨時(shí)重定向??梢杂肦edirectPermanent方法發(fā)送一個(gè)永久重定向。例如:

 

3.4.2、重定向到路由系統(tǒng)的URL

使用重定向到文本URL的缺點(diǎn)是:限定了URL,當(dāng)路由發(fā)生改變后,必須更新URL。幸好我們可以使用路由系統(tǒng),用RedirectToRoute方法來生成有效的URL該方法會創(chuàng)建 RedirectToRouteResult的一個(gè)實(shí)例。如下所示:

3.4.3、重定向到動作(Action)方法

使用RedirectToAction方法能夠很優(yōu)雅的重定向到一個(gè)Action方法,這個(gè)方法僅僅是對RedirectToRoute方法的封裝,讓你指定Action方法和控制器的值,而不需要?jiǎng)?chuàng)建一個(gè)匿名類型。如下所示:

如果想重定向到其他的控制器,需要提供一個(gè)控制器的名稱如:

注意:傳入的Action參數(shù)或控制器參數(shù)在它們被傳遞給路由系統(tǒng)之前是不會被驗(yàn)證的,所以要確保目標(biāo)控制器和Action方法是存在的。

3.4.4、使用TempData保留重定向數(shù)據(jù)

 重定向會引起瀏覽器提交整個(gè)新的HTTP請求,這意味著無法訪問原始的請求的細(xì)節(jié)。如果想將數(shù)據(jù)從一個(gè)請求傳遞到下一個(gè)請求,可以使用TempData()方法。

TempData類似于Session,不同的是TempData在被讀取以后會被標(biāo)記刪除,并且當(dāng)請求被處理的時(shí)候被移除。這是一個(gè)針對想在整個(gè)重定向過程中保持短期數(shù)據(jù)的非常完美的安排。如下示例:

首先添加一個(gè)MySecond控制器,并添加對應(yīng)的視圖,視圖引擎為Razor并編寫如下代碼:

 MySecond控制器代碼

public class MySecondController : Controller
  {
    public ActionResult Index()
    {
      TempData["Message"] = "Hello TempData";
      TempData["Data"] = "TempData的值只能讀取一次";
      return View();
    }
    public ActionResult TempDataTest()
    {
      return View();
    }
  }

Index視圖代碼

@{
  Layout = null;
}

<!DOCTYPE html>

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>Index</title>
</head>
<body>
  <div>
    the Data is:@TempData["Data"]
  </div>
</body>
</html>

TempDataTest視圖代碼

@{
  Layout = null;
}

<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>TempDataTest</title>
</head>
<body>
  <div>
    the Data is:@TempData["Data"]<br/>
    the Message is:@TempData["Message"]
  </div>
</body>
</html>

運(yùn)行結(jié)果如下:

注意:在Index里面沒有讀取TempData["Message"]的值,但是Index和TempDataTest都讀取了TempData["Data"]的值。這樣做是為了驗(yàn)證TempData里面的值在不同的視圖只能讀取一次。

TempData里面的值在一次請求里面只能讀取一次。 如果我們想讀取TempData的值但是又不讓它被刪除,可以使用TempData.Peek(“Data”)方法。 如果想在保持一次TempData里面的值,可以使用TempData.Keep("Data")。

3.5、返回文本數(shù)據(jù)

 

Content方法參數(shù)說明: 發(fā)送的文本數(shù)據(jù)、響應(yīng)的HTTP content-type header、編碼格式。 可以忽略最后兩個(gè)參數(shù),在MVC框架假定數(shù)據(jù)是HTML(content type為text/html)情況下,它會查詢一種瀏覽器聲明支持的編碼格式。

3.6、返回XML數(shù)據(jù)

using LinqService;
using System.Xml.Linq;
public ContentResult GetXMLData()
{
  List<Books> books = bll.GetListBooks();
  XElement data = new XElement("BooksList", books.Select(e =>
  {
    return new XElement("Books",
     new XAttribute("title", e.Title),
     new XAttribute("author", e.Author),
     new XAttribute("Price", e.Price.ToString()));
  }));
}

3.7、返回JSON數(shù)據(jù)

public ActionResult JSON()
    {
      JsonResult json = new JsonResult();

      UserInfo userinfo=new UserInfo{ ID=1, Name="張三", Age=11 };

      List<UserInfo> list=new List<UserInfo>{
        new UserInfo{ ID=1, Name="張三", Age=11 },
        new UserInfo{ ID=1, Name="張三", Age=11 },
        new UserInfo{ ID=1, Name="張三", Age=11 },
        new UserInfo{ ID=1, Name="張三", Age=11 }
      };
      //json.Data = list;
      //json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
      //return json;
      //return new JsonResult() { Data = list, JsonRequestBehavior=JsonRequestBehavior.AllowGet };

      return Json(userinfo,JsonRequestBehavior.AllowGet);
    }

JSON是一個(gè)輕量級的基于文本格式,用來描述分層數(shù)據(jù)結(jié)構(gòu)的, JSON是有效的javascript代碼,這意味著被所有的主流瀏覽器支持

在MVC框架里面內(nèi)置了JsonResult類,讓我們能夠序列化.NET對象為json格式。通過Json方法可以創(chuàng)建返回JsonResult結(jié)果類型

3.8、返回文件和二進(jìn)制數(shù)據(jù)

public FileResult AnnualReport()
{
  string filename = @"D:\C#高級編程.doc";
  string contentType = "application/doc";
  string downloadName = "C#高級編程2013.doc";
  return File(filename, contentType, downloadName);
}

如果不知道具體的MIME類型,可以指定contentType 為application/octet-stream

lFileResult是一個(gè)抽象基類,其三個(gè)實(shí)現(xiàn)的子類 :

1.FilePathResult :直接把服務(wù)器的某個(gè)路徑下的文件發(fā)給瀏覽器

2.FileContentResult :發(fā)送一個(gè)內(nèi)存中的二進(jìn)制數(shù)據(jù)給瀏覽器

3.FileStreamResult:發(fā)送已經(jīng)打開的文件流內(nèi)容給瀏覽器。

3.9、返回錯(cuò)誤和HTTP Codes

發(fā)送特定的HTTP結(jié)果碼

可以使用HttpStatusResult類將一個(gè)特定的HTTP狀態(tài)碼發(fā)送給瀏覽器。這個(gè)類沒有對應(yīng)的控制器輔助器方法,因此必須直接對這個(gè)類進(jìn)行實(shí)例化,如下所示:

 public HttpStatusCodeResult StatusCode()
 {
   return new HttpStatusCodeResult(404,"file not found");
 }

發(fā)送404結(jié)果

可以使用便利的HttpNotFoundResult類來獲取上面相同的效果,這個(gè)類派生于HttpStatusResult,而且可以用控制器的便利方法HttpNotFound來創(chuàng)建。如下所示:

 public HttpStatusCodeResult StatusCode()
 {
  return HttpNotFound();
 }

發(fā)送401結(jié)果

另一個(gè)特定的HTTP狀態(tài)碼的封裝程序類是HttpUnauthorizeResult,它返回401代碼,用來指示一個(gè)未授權(quán)請求。如下所示:

 public HttpStatusCodeResult StatusCode()
 {
   return new HttpUnauthorizedResult();
 }

總結(jié):在本文章中,主要是對MVC設(shè)計(jì)模式中的控制器和動作方法做了詳細(xì)介紹,主要從實(shí)現(xiàn)自定義的控制器類兩種方式著手,然后介紹了控制器對數(shù)據(jù)的接收與響應(yīng)系列內(nèi)容。對數(shù)據(jù)接收主要來源查詢字符串值、表單數(shù)據(jù)、路由數(shù)據(jù)做了分別介紹,對數(shù)據(jù)的響應(yīng)包括視圖 、文本數(shù)據(jù)、XML數(shù)據(jù)、JSON數(shù)據(jù)、文件或者二進(jìn)制數(shù)據(jù)、返回錯(cuò)誤和HTTP Codes、定制的ActionResult、重定向做了分別介紹。

相關(guān)文章

最新評論