[Visual Studio "11" Series] ASP.NET 4.5 新功能 (3) - ASP.NET MVC 4.0

雖然 ASP.NET MVC 和 Web Form 是不同的系統,但因為它共用 ASP.NET 的核心服務,所以我也將它歸類到 Visual Studio "11" 的新功能之一,不過在討論時大多數都會將 MVC 4.0 視為一個完整的範圍,和 Web Form, Web Pages, Dynamic Data 等分開...

雖然 ASP.NET MVC 和 Web Form 是不同的系統,但因為它共用 ASP.NET 的核心服務,所以我也將它歸類到 Visual Studio "11" 的新功能之一,不過在討論時大多數都會將 MVC 4.0 視為一個完整的範圍,和 Web Form, Web Pages, Dynamic Data 等分開。

好,廢話不多說,開始來談新功能吧。

 

1. Web API

這應該是 MVC 4.0 最指標性的功能之一了,以往如果要開發 HTTP-based Service,通常不是選用 WCF 就是用 ASP.NET 的 HTTP Handler 來做,當然用 MVC 也是可以,只不過 View 的部份要自己處理,或是用 JsonResult, ContentResult, FileContentResult 等非 HTML 的 View Render 來產生,要做的事還真是不少。

ASP.NET MVC 4.0 的 Web API 功能就是為了將一些庶務性工作降低,讓開發人員得以將焦點放在服務的實作,而不是服務和 HTTP 間的轉換。同時它也增加了自我掛載 (Self-hosting) 的機制,讓它可以在 IIS 以外的行程中掛載,例如 Windows Service 或 Console Application 等,讓 Web API 和 ASP.NET MVC 的泛用性更強。

針對 Web API,已經有一位強者寫了文章,我就不贅述太多了:http://www.dotblogs.com.tw/gelis/archive/2012/02/18/69602.aspx

Web API 本身也是一個不小的主題,日後我會再寫些文章來講這個部份。

 

2. Single Page Application (SPA)

單一頁面應用程式 (Single Page Application) 也是 MVC 4.0 指標性的特色之一,照字面來解釋的意思,是指整個應用程式只有一個頁面,這就很有意思了,只有一個頁面就能完成應用程式,想必它背後的通訊和程式流程一定不是 server-side,而是 client-side,並且利用 AJAX 來完成的,但我不是說整個應用程式真的只有一個頁面,而是一個頁面就可以完成基本應用程式的功能,像是 C/R/U/D 流程,可以直接只在一個頁面內就做完。

當然,為了達成這個目標,這個 SPA 網頁一定有些特別的東西,像是整個應用程式的流程,應用程式的 UI 佈局方式,Client/Server 的通訊等等,在 SPA 的架構中,Server 是負責 Data (Model) 和 HTTP Service,也就是 Web API,而 Client 則使用了 MVVM Pattern,由 Knockout.js 提供,而負責和 server 通訊並快取資料的部份由 upshot.js 負責,瀏覽則是以 history.js 和 nav.js 來負責,這些 JavaScript Library 都相容於 jQuery 和 XUI,所以開發人員還是可以選擇常用的 jQuery 來開發 SPA 應用程式。

伺服端的部份,原本常用的 Controller 類別變成了 DbController,作為 Data Controller 的基底類別,DbController 封裝了 Web API 應有的功能,只要利用 DbController 即可快速整合 Controller 和 Model,以及資料。ASP.NET MVC 的核心則針對了 SPA 應用程式部份提供了資料推斷 (Scaffolding) 功能,以支援快速的表單產生範本,讓開發的工作更輕鬆。

對 SPA 有興趣的人可參考:http://www.asp.net/single-page-application

SPA 也會是個有趣的主題,日後我會再寫些文章來講這個部份。

 

3. 專案範本與手機應用程式範本

MVC 4.0 的專案範本有做了不小的改進,除了整個 UI 翻新外,也整合了 jQuery UI 部份功能,例如登入功能整合為登入對話盒:

行動裝置應用程式 (Mobile Application) 部份,也內建對 jQuery Mobile 的支援,因此手機上的畫面會完全以 jQuery Mobile 的視覺介面為主:

 

4. 顯示模式 (Display Mode)

MVC 4.0 因應手機應用程式和原有的桌面應用的部份,提供了一個簡易的分隔模式,只要在 View 中加入一個 ".mobile",就可當做 Mobile 應用的 View,例如:

  • _layout.cshtml : 給桌面應用程式使用。
  • _layout.mobile.cshtml : 給手機應用程式使用。

 

而在 MVC 4.0 中的 View 輸出指令 (ex: Html.Partial() ),也支援了自動偵測瀏覽器類型的功能,如果 MVC 偵測到要求是來自手機瀏覽器,則會自動挑選支援手機的 view (ex: MyPage.mobile.cshtml) 輸出,而若是一般瀏覽器,則輸出一般的 view (ex: MyPage.cshtml)。

顯示模式也是可以自訂的,只要在 Global.asax 的 Application_Start 事件常式中加入類似下列的桯式碼即可:


DisplayModeProvider.Instance.Modes.Insert(0, new
DefaultDisplayMode("iPhone")
{
    ContextCondition = (context => context.GetOverriddenUserAgent().IndexOf
        ("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
 });

 

5. View Switcher/Browser Overriding

View Switcher (檢視切換器) 是部份手機上瀏覽器提供的功能,它可以在手機上切換手機專屬的 view 或一般的 view,MVC 4.0 的 Display Mode 可以完全支援這樣的功能,開發人員直接使用 Display Mode 即可做出支援 View Switcher 的檢視方式,而對於沒有 View Switcher 的桌面應用程式,ASP.NET 也提供了一個可以產生 View Switcher 的方法 @Html.Partial("_ViewSwitcher")。

View Switcher 的功能,是以 MVC 4.0 上的 Browser Overriding 功能為主,Browser Overriding 允許開發人員透過程式的方式去覆寫由瀏覽器傳入的 User Agent,以達到模擬瀏覽器的功能,包含這四個 HttpContext 方法:

  • HttpContext.SerOverriddenBrowser()
  • HttpContext.GetOverriddenUserAgent()
  • HttpContext.GetOverriddenBrowser()
  • HttpContext.ClearOverriddenBrowser()

 

6. 支援非同步的呼叫與處理。

MVC 4.0 一樣可支援 .NET Framework 4.5 的 async 和 await 功能,例如:


public async Task<ActionResult> Index(string city) {
    var newsService = new NewsService();
    var sportsService = new SportsService();
    
    return View("Common",
        new PortalViewModel {
        NewsHeadlines = await newsService.GetHeadlinesAsync(),
        SportsScores = await sportsService.GetScoresAsync()
    });
}

 

開發人員也可以額外加入 Timeout 的設定給非同步方法:


[AsyncTimeout(2500)]
 [HandleError(ExceptionType = typeof(TaskCanceledException), View = "TimedOut")]
public async Task<ActionResult> Index(string city,
    CancellationToken cancellationToken) {
    var newsService = new NewsService();
    var sportsService = new SportsService();
   
    return View("Common",
        new PortalViewModel {
        NewsHeadlines = await newsService.GetHeadlinesAsync(cancellationToken),
        SportsScores = await sportsService.GetScoresAsync(cancellationToken)
    });
}

 

7. Windows Azure Platform 支援

MVC 4.0 已完支援 Windows Azure SDK v1.5 以後的版本,日後在新的 MVC 4.0 Final 或 Windows Azure SDK 新版本,也會完全支援。

 

Reference:

http://www.asp.net/whitepapers/mvc4-release-notes