ASP.NET MVC 第四個預覽版(第一部分)

來源:互聯網
上載者:User

【原文地址】ASP.NET MVC Preview 4 Release (Part 1)
【原文發表日期】 Monday, July 14, 2008 2:18 AM

 

這個新的版本裡有一堆新特性和功能,實際上其數目之多,我決定我需要2個文章才能對它們全部論及,這第一個貼子將討論第四個預覽版中的緩衝(Caching),錯誤處理(Error Handling)和安全(Security)新特性,以及一些測試方面的改進,我下一個貼子將討論這個版本中新加的AJAX特性。

理解過濾攔截器(Filter Interceptors)

Action過濾器屬性(Filter Attributes)是ASP.NET MVC中一個非常有用的擴充功能,這個東西最初是在第二個預覽版中加入的,允許你在對MVC控制器的請求中注入攔截代碼,在 Controller和它的Action方法執行的前後執行,這可以促成一些非常棒的封裝情境,在其中,你能以一種非常乾淨的,聲明的方式輕鬆地封裝和重用功能。

下面是一個極其簡單的例子,ScottGuLog過濾器,我可以用它來記錄在請求的執行過程中拋出的異常的細節。實現一個定製的過濾器類非常容易,只要繼承自ActionFilterAttribute類型,覆蓋其中的適當方法,在Controller的Action方法調用之前或之後,或者在ActionResult處理進回複之前或之後運行代碼。

在ASP.NET MVC Controller中使用過濾器也是非常容易的,只要在Action方法上將其聲明為一個屬性,或者在Controller類本身之上聲明即可(在這個情形下,它將運用於Controller中所有的Action方法):

在上面,你可以看到應用了的2個過濾器的例子,我表示要將“ScottGuLog”運用於“About”這個Action方法,而將“HandleError”過濾器運用於HomeController的所有Action方法之上。

 

ASP.NET MVC的以前幾個預覽版本早就開啟了這個過濾器擴充性,但並沒有發布預製的過濾器,這第四個版本包含了幾個有用的過濾器,可以用來處理輸出緩衝,錯誤處理以及安全的情境。

OutputCache過濾器

[OutputCache]過濾器提供了一個簡易的方式,將ASP.NET MVC與ASP.NET的輸出緩衝功能相結合(在ASP.NET MVC第三個預覽版中,你要編寫代碼才能實現這個功能)。

想實驗一下的話,修改HomeController(是由VS ASP.NET MVC項目模板產生的)中的Index Action方法的Message值來顯示目前時間:

在運行這個應用時,每次重新整理頁面,你都會看到時間戳記更新:

我們可以在我們的Action方法上加[OutputCache]屬性來給這個URL啟用輸出緩衝,我們將使用下面的聲明來配置緩衝回複10秒鐘:

現在,當你點擊重新整理時,你會看到時間戳記每10秒鐘才更新一次。這是因為action方法每10秒鐘才會被調用一次,其他時間的所有請求都是從ASP.NET輸出緩衝中供應的(意味著不用運行什麼代碼,所以請求的回複超快)。

除了支援時間間隔外,OutputCache屬性還支援標準的 ASP.NET 輸出緩衝變化選項(隨參數,頭內容,內容編碼以及定製邏輯而變化)。例如,下面的例子會根據PageIndex查詢字串參數的值儲存不同的頁面緩衝版本,然後會根據進來的URL的查詢字串值自動顯示正確的版本:

你還可以結合ASP.NET的資料庫緩衝失效功能,該功能允許你在URL依賴的資料庫被修改後自動導致緩衝失效(小技巧:實現這個功能的最佳方案是在你的web.config中配置一個CacheProfile節,然後在OutputCache屬性中配置指向該節點)。

HandleError過濾器

[HandleError]過濾器提供了一種聲明的方式,來在一個Controller或一個Action方法上表示,如果在處理一個ASP.NET MVC請求中發生錯誤的話,應該顯示一個友好的錯誤回複。

要實驗一下的話,在項目中加一個新的TestController,實現一個action方法,在其中象下面這樣拋出一個異常:

在預設情形下,如果將瀏覽器指向這個URL的話,它會給遠端使用者顯示一個預設的ASP.NET錯誤網頁(除非你去web.config檔案中配置了<customErrors>節):

我們可以在我們的Controller類或其中的Action方法上加一個[HandleError]屬性,來改變要顯示的HTML錯誤,而顯示對終端使用者比較友好的資訊:

HandleError過濾器會捕捉住所有的異常(包括處理視圖模板時拋出的錯誤),在出錯時顯示一個定製的Error視圖回複。在預設情形下,它試圖在你的項目中尋找一個名為“Error”的視圖模板來產生回複。你可以將“Error”視圖置於同個Controller相應的視圖的目錄之中(例如,上面的TestController的\Views\Test目錄),也可以置於\Views\Shared檔案夾中(系統會先找一個特定於控制器的出錯視圖,如果沒找到的話,會在Shared檔案夾中尋找,該檔案夾包含了為所有控制器所共用的視圖)。

從第四個預覽版開始,在你建立新的ASP.NET MVC項目時,Visual Studio現在會自動為你在\Views\Shared檔案夾中加一個預設的“Error”視圖模板:

在我們的TestController類上加[HandleError]屬性後,在預設情形下,它會給遠端使用者顯示一個象下面這樣的HTML錯誤頁面(注意,它使用了項目的母板頁,這樣就將錯誤資訊整合進了網站之中)。很明顯地,你可以去定製這個Error視圖模板,顯示你想要的任何HTML或者更加友好的錯誤資訊,下面只不過是隨該版本而來的原裝的資訊:

為協助開發人員,在本地瀏覽應用時,Visual Studio中由新的項目模板提供的預設的Error視圖模板還會顯示額外的錯誤堆疊追蹤資訊:

你可以在Error視圖模板中將代碼刪除來將其關閉,或者也可以在你的web.config檔案中將<customErrors>設成“Off”。

在預設情形下,[HandleError]過濾器將捕捉和處理請求中拋出的所有異常。你也可以在[HandleError]屬性上指定 "ExceptionType"和"View"屬性來指定你感興趣的特定異常類型,以及指定定製的錯誤視圖:

在上面的代碼中,我選擇為SqlException和NullReferenceException異常顯示定製的錯誤視圖,所有其它的異常則將使用預設的“Error”視圖模板。

Authorize過濾器

[Authorize]過濾器提供了一種聲明的方式來控制對Controller或Action方法的存取權限,它允許你表示使用者必須已經登入,或者要求他們必須是某個特定的使用者或是某個特定的資訊安全角色才能訪問。這個過濾器可以用於任何類型的認證方式(包括基於Windows以及Forms的認證),還提供了自動將匿名使用者轉向到登入頁面的支援。

要實驗一下的話,在Visual Studio中給預設產生的HomeController中的“About” action方法加一個[Authorize]過濾器:

象上面這樣聲明[Authorize]屬性工作表示使用者必須已經登入進網站才能請求“About” action。如果還沒登入的使用者試圖訪問/Home/About URL的話,他們會無法訪問該頁。如果web應用是配置成使用基於Windows的認證的話,ASP.NET會自動使用他們的Windows登入身份來認證使用者,如果成功的話,就會允許他們訪問。如果web應用是配置成使用基於Forms的認證的話,[Authorize]會自動地將使用者轉向到登入頁面以作認證(之後他們就能訪問了):

[Authorize]屬性也允許你將存取權限只授予特定的使用者或角色。例如,如果我要將"About" action的存取權限只限於我自己和Bill Gates的話,我可以這麼寫:

一般來說,除了無關緊要的應用外,你不該在代碼中硬寫使用者名稱字,一般地,你應該使用象“角色”這樣的比較高層次的概念來定義許可權,然後另外將使用者映射到角色上(例如,使用活動目錄或資料庫來儲存這些映射)。[Authorize]屬性通過使用“Roles”屬性,極大地方便了對Controllers和Actions的訪問的控制:

[Authorize]屬性並不依賴於任何特定的使用者身份或角色管理機制,它只用ASP.NET的"User"對象,該對象是可擴充的,允許使用任何身份系統。

AccountController類

我在上面提到了[Authorize]屬性可用於任何認證或使用者身份管理系統,你可以編寫或使用你想要的任何定製的登入UI或使用者/密碼管理系統。

但為助你起步,Visual Studio中的ASP.NET MVC項目模板現在包含了一個預製的“AccountController”類以及相關的登入視圖,它們實現了表單認證成員系統,支援登入,退出,註冊新使用者,改變密碼等。所有的視圖模板和UI都可以輕鬆地定製,是獨立於 AccountController 類或實現的:

Site.master模板在右上方也包括了UI,提供登入/退出功能,在使用基於表單的認證時,如果你目前還沒認證的話,它會提示你登入:

在你通過認證後,它會顯示一個歡迎資訊,以及一個退出連結:

點擊上面的Login連結,會將使用者轉到象下面這樣的登入螢幕來做認證:

新使用者可以點擊註冊連結來建立新的帳號:

錯誤處理和錯誤資訊顯示也是內建的:

加到新項目中的AccountController類使用了內建的ASP.NET Membership API來儲存和系統管理使用者憑證(Membership系統使用了提供器API,允許接入任何後台儲存,ASP.NET包含了內建的Active Directory 和 SQL Server提供器)。如果你不想使用內建的Membership系統的話,你可以保留同樣的AccountController action方法簽名,視圖模板,Forms認證ticket邏輯,只要替換掉AccountController類中的使用者帳號邏輯就可以了。在下一個ASP.NET MVC預覽版中,我們計劃將AccountController和使用者身份系統間的互動邏輯封裝成一個介面,這將進一步方便你接入你自己的使用者儲存系統(而不必實現一個完整的membership提供器),以及方便你對它和AccountController進行單元測試。

我們的希望是,這給大家提供了一個很好的快速起步的方式,允許大家在建立一個新項目後,就有一個工作的end to end的安全系統。

測試TempData

在這第四個預覽版的第一個貼子裡要提到的最後一個改進是對Controller類所做的一些改進,這些改進將允許你更輕鬆地單元測試TempData集合,TempData 屬性允許你儲存你要持久到將來一個使用者請求的資料,它的意義在於,只持續到下一個請求為止(之後就被去除了)。一般用於這樣的MVC情境: 你想要進行一個用戶端的重新定向來改變瀏覽器中的URL,然後想要一種簡便的方式來儲存臨時的資料。

在以前的ASP.NET MVC預覽版中,你需要mock對象才能測試TempData集合。在第四個預覽版中,你不再需要mock或設定什麼了,你現在可以在單元測試中,直接在Controller的TempData集合中添加和核實對象(例如,在調用控制器的一個action方法之前填充它的TempData屬性,或者在action方法返回後核實action方法更新了TempData)。TempData集合的實際儲存機制現在封裝在單獨的TempDataProvider屬性中了。

結論

希望上面的貼子內容對即將發布的ASP.NET MVC的第四個預覽版中的若干新特性和變動提供了一個簡單的介紹,下一個貼子將討論新加的 AJAX 功能,並且示範如何利用它。

希望本文對你有所協助,

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.