[譯]Professional ASP.NET MVC3(01)-Chapter 1:Getting Started(上)


本章概要

  • 理解ASP.NET MVC
  • ASP.NET MVC3 預覽
  • 如何創建MVC3應用程序
  • MVC應用程序結構

本章首先簡要介紹ASP.NET MVC, 解釋它怎樣適應ASP.NET MVC的歷史版本,總結ASP.NET MVC3的主要更新,並展示如何配置ASP.NET MVC3應用程序的開發環境。 

鑒於本書是介紹某web框架的高級系列教程之一,因此將介紹的言簡意賅。我們不打算花費過多的時間來說服您來學習ASP.NET MVC,而是假設您已經為此而購買了本書。要想證明一個軟件框架和模式成功,最好的方式莫過於展示它在現實世界中的應用。


ASP.NET MVC簡介

ASP.NET MVC是將Model-View-Controller模式應用到ASP.NET 框架,而形成的搭建web應用的架構。我們首先看一下ASP.NET MVC和ASP.NET 框架的關系,然后再逐個難點進行突破。

ASP.NET MVC怎樣適應ASP.NET

自從2002年發布ASP.NET 1.0以來,人們很容易把ASP.NET 和Web Forms看做一回事。ASP.NET 通常支持兩個抽象層:

  • System.Web.UI: Web窗體層。包括服務端控件,View State等;
  • System.Web:管道。提供基本的web堆棧,包括models, handlers,以及HTTP堆等。

ASP.NET的主要開發方法是有一系列的web表單堆疊而成的-通過拖拽控件,魔術式的狀態管理,以及后台編譯時神奇的服務端控件處理(但經常混淆頁面生命周期,不夠優化的HTML,等等)。

但是,有些可能性還是存在的——直接響應HTTP請求,按照web框架真正的工作方式來進行構建,以及通過Handlers,Modules或其他手寫代碼來編寫優雅的HTML代碼。你可以實現,但是十分復雜,因為沒有任何內建的模式來支持這些。但是,在更廣范圍的計算機科學界是不乏設計模式的。自從2007年發布ASP.NET MVC以來,ASP.NET MVC正在逐漸成為最流行的web開發框架之一。

MVC模式

Model-View-Controller(MVC)多年來一直是重要的設計模式之一。1979年時最初被稱作Tbing-Model-View-Editor,后來簡稱Model-View-Controller。它是用來分離應用程序關注點的強有力的方法(例如,將數據訪問層和展示邏輯分離開來),並能極好地適用於web應用程序。很明顯,分離關注點將會為應用程序的設計添加些許額外的復雜度,但肯定是利大於弊。自從發布以來已經應用於許多框架中,可以看到,無論在Java還是C++, Mac還是Windows,它已經漸漸融入了諸多框架。

MVC將應用程序的用戶界面划分為三個方面:

  • Model:一些描述將要處理的數據的類,並且定義一些數據修改和操作的邏輯規則。
  • View:定義如何展示應用程序的用戶界面(UI)。
  • Controller: 處理用戶交互、應用程序流以及具體的應用邏輯的類。

MVC用作用戶界面模式

請注意我們引入MVC作為一種用戶界面模型。MVC模式展示了一種處理用戶交互的解決方案,但是並沒有提到應該怎樣處理數據訪問、服務交互等其他應用程序的關注點。在通往MVC時要記住一點:它是有用的模式,但很可能只是開發應用過程中用到的諸多模式之一。

MVC用作web框架

MVC模式經常被用在web編程中,關於ASP.NET MVC可以大致這樣理解:

  •  Models:這是一些呈現所關注的領域模型的類。這些領域模型通常封裝存儲在數據庫中的數據,以及操作數據和增強領域業務邏輯的代碼。對於ASP.NET MVC而言,通過使用Entity Framework和NHibernate工具,結合針對領域模型的業務邏輯的自定義代碼,它在某種程度上類似於數據訪問層。
  •  View:一個動態生成HTML的模板。在第3章會更加深入了解view。
  •  Controller:管理View和Model質檢關系的具體類。它響應用戶輸入,告知Model,並決定要展示的view。在ASP.NET MVC中,該類以Controller為后綴。
通往MVC3之路

短短兩年之內,已經發布了三個主要的ASP.NET MVC版本以及幾個其他過渡版本。為了更好地理解ASP.NET MVC3,了解它的發展歷程也是很重要的。本節主要介紹三個ASP.NET MVC版本的內容及背景。

ASP.NET MVC 1概述

2007年2月,微軟的Scott Guthrie (“ScottGu”)在飛往美國東海岸參加會議的途中構思出了ASP.NET MVC的要點。這是一個簡單的應用,只包含幾百行的代碼,但為一些web開發者聽眾帶來的希望和潛力卻是巨大的。

接下來,2007年10月,在華盛頓雷德蒙德舉行的奧斯汀ALT.NET會議上,ScottGu想眾多開發者展示了“在飛機上編寫的超酷的東西”,並問他們是否看到了這個需要以及大家的看法。這是比較令人震驚的。事實上,很多人關心這個叫做Scalene的原型。Eilon Lipton 2007年9月將第一個原型發送給了團隊,然后他和ScottGu 一起將原型、代碼以及想法來回修改了多次。

即便到了官方版本發布之時,很明顯ASP.NET MVC仍然不是我們標准的微軟產品。它的開發周期包含了很強的交互性:官方版本發布之前發布了九個測試版本,進行單元測試,源代碼也是采用公開的序列號。這一切都強調了一個哲理:在開發過程中要注重溝通交流。最終的成果是官方版MVC 1.0發布了,包含代碼及單元測試,而且已經被由使用它的開發者們進行了預覽和使用。ASP.NET MVC 1.0於2009年3月13日正式發布。

ASP.NET MVC 2概述

僅僅時隔一年之后,2010年三月ASP.NET MVC2發布了。MVC2的主要特點包括:

  • 支持自定義模板的UI helpers.
  • 客戶端和服務端基於屬性的Model驗證
  • 強類型HTML helper
  • 改進Visual Studio 工具 :基於使用ASP.NET MVC1開發應用的開發者們的反饋,添加了許多API強化和高級特性,例如:
  • 支持將較大的應用進行分割
  • 異步Controllers支持
  • 支持通過使用Html.RenderAction展示一個頁面/站點的子段落
  • 許多新的helper方法,實體,以及API強化

MVC2的發布開設了一個先例,即沒有太多突破性的改變。我想這是ASP.NET MVC設計模式需要遵循的一個約定,在不改變核心的前提下進行一系列擴展。

ASP.NET MVC3概述

迫於Web Matrix的發布日期,ASP.NET MVC3(以后本書簡稱MVC3)在MVC2后10個月就發布了。假如MVC 3是裝在箱子里的,那么它的前面可能會寫着:

  • 包含Razor引擎的View表現層!
  • .NET 4的數據注釋支持!
  • 改進Model驗證后的流線型驗證!
  • 包含了依賴方案和整體Action過濾的強大地鈎子!
  • 豐富的javascript支持,包括不唐突的javascript, jQuery驗證以及JSON綁定!
  • 開始NuGet!!!

對於曾經用過之前版本MVC的讀者來說,我們將快速瀏覽一下這幾個主要特性來開始我們的MVC之旅。

Razor引擎

Razor是自十年前ASP.NET 1.0發布以來對於HTML展示的一個最主要的更新。在MVC1和2中默認使用的view引擎是Web Forms View引擎,因為它和Web Forms使用相同的ASPX/ASCX/MASTER文件和語法。它可以正常運作,但它的設計是支持在圖形編輯器中進行控件編輯的,然后進行顯示。下面是一個Web Forms頁面語法的例子:

<%@ Page Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master”

Inherits=”System.Web.Mvc.ViewPage<MvcMusicStore.ViewModels.StoreBrowseViewModel>”

%>

<asp:Content ID=”Content1” ContentPlaceHolderID=”TitleContent” runat=”server”>

Browse Albums

</asp:Content>

<asp:Content ID=”Content2” ContentPlaceHolderID=”MainContent” runat=”server”>

<div class=”genre”>

<h3><em><%: Model.Genre.Name %></em> Albums</h3>

<ul id=”album-list”>

<% foreach (var album in Model.Albums) { %>

<li>

<a href=”<%: Url.Action(“Details”, new { id = album.AlbumId }) %>”>

<img alt=”<%: album.Title %>” src=”<%: album.AlbumArtUrl %>” />

<span><%: album.Title %></span>

</a>

</li>

<% } %>

</div>

</asp:Content>

Razor是專門設計用來作為view引擎語法的。它有一個主旨: code-focused templating for HTML generation.下面是如何使用Razor生成相同的標簽:

@model MvcMusicStore.Models.Genre

@{ViewBag.Title = “Browse Albums”;}

<div class=”genre”>

<h3><em>@Model.Name</em> Albums</h3>

<ul id=”album-list”>

@foreach (var album in Model.Albums)

{

<li>

<a href=”@Url.Action(”Details”, new { id = album.AlbumId })”>

<img alt=”@album.Title” src=”@album.AlbumArtUrl” />

<span>@album.Title</span>

</a>

</li>

}

</ul>

</div>

Razor語法容易輸入和閱讀,它不像Web Forms引擎中包含XML類似的重量級語法。

我們已經談了用Razor語法進行開發的不同。為了將它推廣到更多的地方,我們一起看一下開創Razor語法的團隊的設計目標:

  •  簡潔,豐富,流暢: Razor對於生成HTML的模板的及其關注,最終造就了極其簡約的語法。這不僅減少了鍵盤輸入,當然這是不言而喻的,另外它還能很容易的表達你的意圖。一個關鍵的例子是對於標簽和代碼之間傳遞數據時的簡化。當你用循環來寫一些model屬性時會看到實際效果:

@foreach (var album in Model.Albums)

{

<li>

<a href=”@Url.Action(“Details”, new { id = album.AlbumId })”>

<img alt=”@album.Title” src=”@album.AlbumArtUrl” />

<span>@album.Title</span>

</a>

</li>

}

基於母版頁的概念進行改進,Razor使用Layouts簡化了標簽,它具有更高的靈活性和更少的代碼。

  •  並非一種新生語言:Razor是一種讓你能夠憑直覺在模板中使用.NET編碼技術的語法。
  •  易於學習:正因為Razor不是一種新的語言,所以它是很容易學習的。了解了HTML,了解了.NET;那么就開始鍵入HTML,然后在需要編寫.NET代碼的時候輸入@符號就可以了。
  •  使用任何文本編輯器:由於Razor是專注於HTML的輕量級語法,你可以選擇任意一種編輯器。Visual Studio的語法高亮和智能感知特性是非常友好的,不過實際上Razor簡單到你可以在任何文本編輯器中進行編輯。
  •  強大的智能感知:盡管Razor設計之初並未要求智能感知,不過當查看model對象支持的屬性時,智能感知將會提供極大的便利。在這些情況下,Razor確實在Visual Studio中提供了完善的智能感知,如圖1-1.

clip_image001

  •  單元測試:Razor引擎的核心編譯引擎並不依賴於System.web或ASP.NET等,它可以在單元測試甚至命令行中執行。盡管目前還沒有直接支持這些的工具,但可以使用類似於David Ebbo 的Visual Studio單文件生成器(http://visualstudiogal-lery.msdn.microsoft.com/1f6ec6ff-e89b-4c47-8e79-d2d68df894ec/)的系統來將view編譯成類,然后像其他項目一樣進行加載和測試。

這僅僅是Razor使編寫view代碼簡潔有趣的亮點之一,我們將在第3張中進一步深入討論。

輸入驗證改進

輸入驗證是構建Web應用過程中非常重要的一環,但是並不有趣。我通常在確信它正常工作的前提下,花費盡可能少的時間來編寫驗證代碼。

MVC2的屬性驅動驗證系統通過用聲明性代碼取代反復的強制性編碼,從而減少了該過程中的許多麻煩。有許多情況下最好忘掉這種“主邏輯”,並且不得不編寫更多大量的代碼。MVC3擴展了這種驗證支持,來應對將可能遇到的大多數情景。要想了解ASP.NET MVC更多關於驗證的信息,請查看第6章。

.NET 4數據注釋支持

MVC2是基於.NET3.5進行編譯的,所以並沒有提供對於.NET 4數據注釋功能的支持。由於.NET 4的支持,目前MVC3已經添加了一些新的並且非常有用的驗證特性。這些例子包括:

  • MVC 2中的DisplayName特性是不能本地化的,但.NET 4支持的System.ComponentModel.DataAnnootations Display特性是可以的。
  • ValidateAttribute在.NET 4中得到了增強,可以更好地在驗證整個model的上下文時起作用,大大簡化了否則可能要引用兩個model屬性的驗證。
改善model驗證而進行流線型驗證

MVC3對於.NET 4 IValidatableObject借口的支持得到了廣大的認同。通過在model類中實現該借口並實現Validate方法,你可以通過任何你能想到的方式擴展model類。代碼如下所示:

public class VerifiedMessage : IValidatableObject {

public string Message { get; set; }

public string AgentKey { get; set; }

public string Hash { get; set; }

public IEnumerable<ValidationResult> Validate(

ValidationContext validationContext) {

if (SecurityService.ComputeHash(Message, AgentKey) != Hash)

yield return new ValidationResult(“Agent compromised”);

}

}

豐富的javascript支持

JavaScript在當代任何web應用中都是十分重要的部分。ASP.NET MVC3添加了一些客戶端開發的重要支持,並集成了高質量JavaScript的當前標准。要想了解ASP.NET MVC3中新的Javascript相關特性,請看第8章。

高級特性

Dependency Resolution

ASP.NET MVC3引入了名為dependency resolver的新概念,它極大的簡化了應用程序中的依賴注入的使用。它更容易去除應用程序組建的耦合性,並且提高了可配置性和可測試性。

以下情況下已經添加了相應支持:

  • Controllers(注冊並注入controller工廠,注入controller)
  • Views(注冊並注入view引擎,將依賴注入到view頁面)
  • Action 過濾器(定位並注入過濾器)
  • Model綁定(注冊並注入)
  • Model驗證提供(注冊並注入)
  • Model元數據提供(注冊並注入)
  • 值提供(注冊並注入)

這是一個足夠大的話題,所以我們用一整章(第11章)來討論。

Global Action Filters

MVC2 action filters提供一個鈎子,在執行某個action之前或者之后執行一些代碼。它是通過將自定義特性應用於controller action或者全局controller來實現的。MVC2中包含了一些過濾器,就像 Authorize特性等。

MVC 3使用全局action過濾器進行了擴展,他可以應用於真個應用程序中的所有action方法。這對於應用程序的基礎關注點是非常有用的,例如如handling和日志等。

MVC3特性總結:各種易用性

這是一些偉大的特性,但是如果讓我來設計這個箱子,我會在上面寫着:

  • 如果你已經推遲了學習ASP.NET MVC,那么它是如此簡單,沒有任何理由再延遲了。
  • 如果你已經學習ASP.NET MVC一段時間了,那么MVC3能讓你的許多復雜的代碼變得不在必要。

 

 

 

注:參考書籍《Professional ASP.NET MVC3》,僅供學習和交流,請勿用於商業用途。


免責聲明!

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



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