老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

精通MVC3摘譯(7)-處理輸出(1)-創新互聯

處理輸出

專注于為中小企業提供網站制作、成都網站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業泰州免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了數千家企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。

controller完成處理請求后,通常需要生產響應。當我們直接實現 IController 接口創建controller時,我們就需要對處理請求的各個方面負責,包括對客戶端的響應。如果我們需要生成HTML響應。比如,我們需要創建組合HTML數據,并使用使用 Response.Write方法傳給客戶端。相似的,如果我們想給用戶瀏覽器返回另一個URL,我們需要調用Response.Redirect方法,直接傳遞URL。這些方法都在下面列出:

using System.Web.Mvc;

using System.Web.Routing;

namespace ControllersAndActions.Controllers {

   public class BasicController : IController {

   public void Execute(RequestContext requestContext) {

       string controller = (string)requestContext.RouteData.Values["controller"];

       string action = (string)requestContext.RouteData.Values["action"];

       requestContext.HttpContext.Response.Write(

       string.Format("Controller: {0}, Action: {1}", controller, action));

       // ... or ...

       requestContext.HttpContext.Response.Redirect("/Some/Other/Url");

       }

   }

}

當你從Controller類中繼承了一個controller,你就使用相同的方法。當你通過Controller.Response屬性,在Execute方法鮮中讀取requestContext.HttpContext.Response屬性時,你得到的返回值是HttpResponseBase類。如下:

using System.Web.Mvc;

namespace ControllersAndActions.Controllers {

   public class DerivedController : Controller {

public void Index() {

string controller = (string)RouteData.Values["controller"];

string action = (string)RouteData.Values["action"];

Response.Write(

string.Format("Controller: {0}, Action: {1}", controller, action));

// ... or ...

Response.Redirect("/Some/Other/Url");

}

   }

}

This approach works, but it has a few problems:

這個方法也是可行的,但是有幾個小問題:

controller類必須包含HTML或者URL結構的詳細信息。這就讓類的可讀性和可維護性變差。

對controller單元測試變的困難,你需要創建模擬的Response信息,使之能從controller接受并處理輸出,這意味著要轉換HTML關鍵字,這都是很痛苦的過程。

對每個請求都用這種方法處理非常乏味,而且容易出錯。一些程序員喜歡絕對控制,喜歡創建一個未處理過的controller,但是大多數程序員對這種方法很不習慣。

幸運的是,MVC Framework能很好的處理這些問題,這個功能叫做action results。下面會介紹action result的概念,并展示幾種不同的從controller生成響應的方法。

理解Action Results

MVC并不直接和Response對象交互,而是返回一個ActionResult類的子類,以此描述我們想從controller中得到的響應,比如呈現視圖或者跳轉到URL或者另一個action方法。

注意,action result系統只是command模式的一個實例。更多信息,看http://en.wikipedia.org/wiki/Command pattern。

當MVC Framework從action方法中收到一個ActionResult對象,它會調用這個類所定義的ExecuteResult方法。這個action result就會處理response對象。生成符合你意圖的輸出。一個簡單的關于RedirectResult 類的例子。如下。MVC Framework開源的一個好處是,你可以看到背后的工作方式。我們簡化了這個類,使之容易讀懂。

public class RedirectResult : ActionResult {

public RedirectResult(string url): this(url, permanent: false) {

}

public RedirectResult(string url, bool permanent) {

Permanent = permanent;

Url = url;

}

public bool Permanent {

get;

private set;

}

public string Url {

get;

private set;

}

public override void ExecuteResult(ControllerContext context) {

string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);

if (Permanent) {

context.HttpContext.Response.RedirectPermanent(destinationUrl,

endResponse: false);

}

else {

context.HttpContext.Response.Redirect(destinationUrl, endResponse: false);

}

}

}

當我們創建一個RedirectResult類的實例時,我們傳入要定位給用戶的URL。 MVC Framework在action方法完成后,會執行ExecuteResult方法,通過framework提供方的 ControllerContext 對象得到query的response對象,同時調用RedirectPermanent方法或者Redirect方法。

我們可以通過創建一個新的RedirectResult實例,并且從action方法返回它。如下代碼,展示了DerivedController類有2個action方法,其中之一使用了RedirectResult來重定向請求。

using System.Web.Mvc;

namespace ControllersAndActions.Controllers {

public class DerivedController : Controller {

public void Index() {

       string controller = (string)RouteData.Values["controller"];

string action = (string)RouteData.Values["action"];

Response.Write(

string.Format("Controller: {0}, Action: {1}", controller, action));

}

public ActionResult Redirect() {

return new RedirectResult("/Derived/Index");

}

}

}

如果你導航到 /Derived/Redirect,瀏覽器會重定位到/Derived/Index。為了是代碼更簡潔,Controller類提供簡單的方法來生成不同的ActionResults,比如,我們可以通過返回Redirect方法的結果,實現同樣的效果。

public ActionResult Redirect() {

return Redirect("/Derived/Index");

}

這對復雜的action result來說沒有什么復雜的,但是你卻能寫出簡潔一致的代碼。你也可以很方便的對你的action方法做單元測試。MVC Framework包含了很多內建的action result類型,在下面列出,這些類型都繼承自ActionResult,而且大多使用起來都很簡單。

精通MVC3摘譯(7)-處理輸出(1)精通MVC3摘譯(7)-處理輸出(1)

通過呈現View來返回HTML

最常用的響應是要從action方法中生成一個HTML,發送給瀏覽器。當使用action result系統,你通過創建ViewResult實例來指定想要生成的HTML。如下演示代碼

using System.Web.Mvc;

namespace ControllersAndActions.Controllers {

public class ExampleController : Controller {

public ViewResult Index() {

   return View("Homepage");

   }

   }

}

這些代碼,使用View方法創建了ViewResult類的實例,該實例作為action方法的結果返回。

注意,返回類型是ViewResult,如果把返回值設為ActionResult,那么此方法也會編譯運行的很好。事實上,一些MVC程序員喜歡吧每一個action的返回值都定義成ActionResult,即使他們知道返回的是一個特定的類型。在此,我們偏向于只要知道該返回的是什么類型,我們就使用這個返回類型。在下面的例子中我們都會這樣做,這會讓你清楚的知道返回的是什么類型的值。

這個例子中,我們指定了想要呈現的view,在這個例子中,我們指定的是Homepage view。

注意,我們可以顯式的創建ViewResult對象,(返回new ViewResult { ViewName ="Homepage" };)這是一個完美的可行的方法,但是我們哈市偏向使用Controller類中定義的簡便方法。

當MVC調用ViewResult對象的ExecuteResult方法,在指定的view上開始一個搜索。如果你項目中使用了area,那么framework會查詢下面幾個地址:

/Areas//Views//.aspx

/Areas//Views//.ascx

/Areas//Views/Shared/.aspx

/Areas//Views/Shared/.ascx

/Areas//Views//.cshtml

/Areas//Views//.vbhtml

/Areas//Views/Shared/.cshtml

/Areas//Views/Shared/.vbhtml

你可以看到,framework查詢的序列中有ASPX視圖引擎創建的view,即使我們指定了Razor。Framework有人會查詢C#和Visual Basic.NET Razor模板。MVC Framework會依次檢查這些文件是否存在,只要有一個匹配了,就會使用這個view作為action方法的結果來呈現。

如果你沒有使用area,或者你使用了area但是要呈現的文件不在上述清單中,那么framework會使用下面的地址繼續查詢“

/Views//.aspx

/Views//.ascx

/Views/Shared/.aspx

/Views/Shared/.ascx

/Views//.cshtml

/Views//.vbhtml

/Views/Shared/.cshtml

/Views/Shared/.vbhtml

同樣的,只要MVC找到一個匹配項,就停止搜尋,這個找到的view就作為對客戶端的響應。

MVC Framework查找目錄順序也是一個約定的配置,你不需要注冊view文件。你只需要把它們放在正確的地方,framework會找到它們的。防止view的這種約定也是可以配置的,在后續會講到。

我們可以在更進一步,在調用view方法時,忽略掉想要呈現的view的名字。如下代碼

using System.Web.Mvc;

namespace ControllersAndActions.Controllers {

public class ExampleController : Controller {

public ViewResult Index() {

return View();

}

}

}

當我我們這么做的時候,MVC Framework假設我們需要呈現的view和action方法的名字是一致的。意思就,上例中的View方法的調用會開始查詢命名為Index的視圖。注意,這樣做的結果就是MVC Framework會尋找和action方法同名的view,但是view的名字事實上由RouteData.Values["action"]的值決定。

View 有多個重載方法,分別可以在創建的ViewResult對象屬性上設置不同的值。比如,你可以顯式的覆蓋view的laout屬性,如下:

public ViewResult Index() {

return View("Index", "_AlternateLayoutPage");

}

使用view的路徑設置view

命名約定的方法非常簡潔,但是限制了你能呈現的view。如果你想要呈現一個指定的view,你可以顯式的輸入路徑。如下:

using System.Web.Mvc;

namespace ControllersAndActions.Controllers {

public class ExampleController : Controller {

public ViewResult Index() {

return View("~/Views/Other/Index.cshtml");

}

}

}

當你如上那樣設定了view,路徑必須以/或者~/開頭,而且必須包含文件擴展名,比如cshtml。

從action方法中傳值給view

我們經常會從action方法中傳數據給view。 MVC Framework提供很多方法來實現這種功能。這里我們會討論一下,在后續我們還會深入討論。

提供View Model對象

你可以通過View方法的參數傳遞對象給view,如下代碼:

public ViewResult Index() {

DateTime date = DateTime.Now;

return View(date);

}

我們傳遞了一個DateTime對象作為view model。我們可以在view中,使用Razor Model關鍵字,訪問這個對象,如下:

@{

ViewBag.Title = "Index";

}

Index

The day is: @(((DateTime)Model).DayOfWeek)

上述例子的view是無類型的或者弱類型的。view不知道任何關于view model對象的事情,它以object的實例來處理這model。(此處譯者測試下來,并不是object類型,而是dynamic類型,不知是為什么)要得到DayOfWeek屬性,必須轉換object類型到DateTime。這雖然可行,但是有點麻煩。我們可以通過強類型view使代碼簡潔點,我們告訴view,它的view model的類型是什么。如下代碼:

@model DateTime

@{

ViewBag.Title = "Index";

}

Index

The day is: @Model.DayOfWeek

我們使用了Razor的model關鍵字指定了view model的類型,注意當我們指定model類型的時候,使用了一個小寫的m,而讀取值的時候用的是大寫的M。這不僅是我們的的代碼證件,也使得Visual Studio在強類型view中支持智能提示。如下:

精通MVC3摘譯(7)-處理輸出(1)

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


當前標題:精通MVC3摘譯(7)-處理輸出(1)-創新互聯
文章鏈接:http://www.xueling.net.cn/article/dgoioe.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 久久久亚洲欧洲日产国产成人无码 | 美女视频黄a视频全免费 | 国产欧美日韩一区二区三区在线 | 日本三级日本三级日本三级极 | 欧美级特黄AAAAAA片 | 久久无码中文字幕无码 | 久久99精品一区二区三区 | 久久综合五月丁香六月丁香 | 欧美激情小视频 | 久久久www免费人成人片 | 蜜桃av一区 | 亚洲中文字幕在线乱码 | 久久黄色视 | 少妇无码太爽了在线观看免费视频 | 亚洲欧美日韩精品专区 | 亚洲国产精品无码中文字2022 | 亚洲AV永久无码精品放毛片 | 婷婷久久综合九色综合97最多收藏 | 国内外精品成人免费视频 | 东方欧美亚洲色图 | 久久久国产精品福利片 | 日本寝取| 91污污视频 | 2020亚洲午夜无码天堂 | 久久精品国产清高在天天线 | 国产高清视频在线播放 | 久久丫精品国产亚洲av | 国产在线不卡精品网站 | 久久天天躁狠狠躁夜夜97 | 久热这里只有精品99国产6 | 国产亚洲人成无码网在线观看 | 噜噜在线视频 | 成人爽a毛片在线视频淮北 成人免费观看视频大全 | 男人添女人下部高潮视频 | 国产九九久久99精品影院 | 激情久久综合网 | 乱码精品一区二区三区 | 柠檬福利第一导航在线 | 亚洲VA在线VA天堂XXXX中文 | 中文字幕在线中文 | 日韩伦理中文字幕 |