[VS2010 Online]初窺ASP.NET MVC(5) – OutputCache & Exception & 資料傳遞

[VS2010 Online]初窺ASP.NET MVC(5) – OutputCache & Exception & 資料傳遞

 

OutputCache

在 ASP.NET MVC 中如果要對頁面上的資料作快取,可以透過 OutputCache 屬性來作處理,

這個屬性提供了一些設定,像是 Duration、SqlDependency、NoStore..等,我們直接以

範例來說明:

 

1.

首先,我們開啟一個ASP.NET MVC應用程式。

 

2.

在HomeController中輸入下列程式碼:

   1: public ActionResult OutputCacheTest()
   2: {
   3:        ViewData["NowTime"] = DateTime.Now.ToLongTimeString();
   4:        return View();
   5: }

 

這段程式碼是將現在的時間放到 ViewData 裡面。

 

3.

我們產生OutputCacheTest View(可以參考這篇),然後我們按下F5執行:

image

 

可以看到畫面上顯示當前時間,但是當你透過瀏覽器去更新畫面時,你會發現,畫面上的

時間會隨之變動。

 

4.

接下來,我們對程式碼作一些變動:

   1: [OutputCache(Duration=15)]
   2: public ActionResult OutputCacheTest()
   3: {
   4:       ViewData["NowTime"] = DateTime.Now.ToLongTimeString();
   5:       return View();
   6: }

這裡加上了OutputCache屬性,這裡我們設置快取時間為15秒。

 

5.

再度按下F5執行,你會發現畫面隔了15秒才會去作更新。

 

除了在程式中設定,可以在aspx以及web.config設定,這跟ASP.NET是一樣的,可以這樣設定:

   1: <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication4.Models.PropertiesMustMatchAttribute>" %>
   2: <%@ OutputCache Duration="15" VaryByParam="none" NoStore="true"   %>
   3: <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
   4:     OutputCacheTest
   5: </asp:Content>
   6: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
   7:     <h2><%
   1: = Html.Encode(ViewData["NowTime"])
%></h2>
   8: </asp:Content>
 
 

Web.config:

   1: <caching>
   2:     <outputCacheSettings>
   3:       <outputCacheProfiles>
   4:         <add name="MyOutputCache" duration="15"  />
   5:       </outputCacheProfiles>
   6:     </outputCacheSettings>
   7:   </caching>
   8:   </system.web>

 

然後就可以在屬性設定CacheProfile作處理。

 

Exception Handle

在ASP.NET MVC中,可以透過HandleError屬性來處理例外,如果沒有設定這個,你會發現當例外發生時,

會出現這樣的畫面:

image

 

這樣看起來實在不好看,而且你的整個程式碼也都被看光了。

 

在加上HandleError屬性之後,你還要作一個設定,這也是跟ASP.NET程式一樣,在Web.config要把

customErrors的mode屬性設定為On:

   1: <customErrors mode="On">
   2:    </customErrors>

 

然後畫面就會導向Error.aspx:

image 

 

接下來,我們來談談資料是要怎樣在Controller與View中傳遞。

 

在ASP.NET MVC中可以透過 ViewDataTempData以及Model傳遞資料。

ViewData在之前的幾篇文章中都有看過了,可以這樣用:

ViewData["Message"] = "Welcome to ASP.NET MVC!";

 

TempData可以這樣用:

TempData["Message1"] = "Hello MVC";

 

你一定心裡有疑問,這兩個有什麼不一樣?

ViewData僅局限於設定的Controller以及View中使用,但是TempData可以在多個Controller

以及View中設定使用。其實TempData就是放置在Session中,在每次頁面request時,就會從Session

中去取得TempData的值,並且刪除這個值,所以只能使用一次

 

剛剛兩個屬性設定都沒有辦法傳遞強型別的資料,所以可以透過Model來作傳遞,像是之前CRUD的範例中:

image 

在Controller的Action回傳給View時還帶有Model參數。

 

然後在View就可以透過下列程式碼取值:

image 

 

那如果要傳遞多個Model參數,要怎麼處理?

可以設定一個類別來封裝兩個屬性:

image

 

然後設定屬性:

image

 

 

透過Add View新增View頁面之後,在畫面上可以這樣取值:

image

 

這裡要注意,產生的ViewPage型別需設定為MyModel:

image 

 

試煉大會,下次見囉。

 

 

參考資料:

1. http://msdn.microsoft.com/en-us/library/system.web.mvc.outputcacheattribute_properties.aspx

2. http://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage.viewdata.aspx

3. http://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbase.tempdata.aspx

 

 

如果您有微軟技術開發的問題,可以到MSDN Forum發問。

如果您有微軟IT管理的問題,可以到TechNet Forum發問喔。