ASP.NET MVC 2開發實戰(sknp00021) Visual Basic範例

在台灣,如果你要學習ASP.NET MVC,可以說是唯一參考書就是「ASP.NET MVC 2開發實戰」,這我之前就已經推薦過了。不過原作者所提供的範例只有C#版本,你可以在知悅網站下載完整程式碼。

不過,我Visual Basic中毒太深,還好,我已經練了一身C# to VB的功夫,所以邊看邊寫邊練,也完整把所有實作重新使用Visual Basic寫了一次。我想把自己練習的Source Code分享出來給大家,讓學Visual Basic的人,有心想要學習ASP.NET MVC的人,也能有一些資料可以參考,這樣,就算你看不懂C#,你也能一邊看著書,一邊參考我寫的Visual Basic範例程式碼。

ASP.NET MVC 2開發實戰 Visual Basic範例程式碼 --注意事項

一、範例內容,只有第九章的實作。
二、使用Visual Studio 2010 + ASP.NET MVC 3

書中有引用兩個MvcPaging及Autofac兩個元件,此兩個元件都針對ASP.NET MVC 3重新改寫過,所以在ASP.NET MVC 2專案中引用會有問題,所以直接改採ASP.NET MVC 3專案來實作。

三、IIF的問題

在MessageController的Index的Action中,有一段使用IIF語法來與C#語法「? :」對應,但Visual Basic中IIF語法在使用Nullable型別時,會產生錯誤,所以我改為使用Optional參數來處理。

四、Autofac 2.4.5.724

本身有針對ASP.NET MVC 3改寫過,所有Autofac程式碼與使用ASP.NET MVC 2時有些許不同。請參考程式註解。


五、程式下載
檔案下載:
1. ASP.NET MVC 2開發實戰 Visual Basic範例程式碼
2.
檔案格式:7z壓縮檔
檔案大小:756 KB
檔案內容:Mvc3GuestbookVB01、Mvc3GuestbookVB02、Mvc3GuestbookVB03、Mvc3GuestbookVB04等四個專案內容。
章節對照:
Mvc3GuestbookVB01 → 9-1節
Mvc3GuestbookVB02 → 9-2節 ~ 9-4節
Mvc3GuestbookVB03 → 9-5節
Mvc3GuestbookVB04 → 9-6節 (完整可執行)

六、註解

我在VB01 ~ VB04中,盡量保留「改寫的步驟」,所以越後面專案的Code,註解越多,看起來會比較亂些,但事實不是這樣的,那只是為了讓各位了解每一改寫的步驟。程式碼部分,我已經盡量打上註解,如果有問題,請以書籍為主。

童言童語 -- 下次再來

每天早上要出門,大女兒都會跟我要Kiss goodbye,而且學得婆婆真傳,平常都會說「要小心哦!」但今天不知為何他說的是:

下次再來。

我跟婆婆說,我是「常客」還是「熟客」!

然後,只能笑笑的回說:「哦,好,我下次再來。」

然後笑著出門。

關於.NET Framework / ASP.NET這條路

.NET Framework歷史版本及功能,第6點是我自己整理。
  1. .NET Framework 1.0
  2. .NET Framework 1.1
  3. .NET Framework 2.0
    CLR + Windows forms + Web Services + ASP.NET
  4. .NET Framework 3.0
    .NET Framework 2.0 + WCF + WF + WPF + CardSpace
  5. .NET Framework 3.5
    .NET Framework 3.0 + LINQ + AJAX + REST
  6. .NET Framework 4.0
    .NET Framework 3.5 + Entity Framework + ASP.NET MVC + Parallel
先說結論,再說故事。

結論

通常第一版都是實驗性質或有很大的改進空間,不管是多好的東西都一樣。從第二版開始,似乎是個不錯的開始。

故事1--.NET Framework 2.0


現在的資訊爆炸,但這些資訊你可以不看。但就資訊技術人員而言,技術更新的速度才是一大挑戰,以前一個技術能讓你十年有飯吃,現在一個技術能讓你三年有飯吃就很不錯了,技術更新的速度讓人「怕怕的」,我實在很敬佩那些永遠走在資訊前端的前輩,有著過人的領悟力與學習力。

話說從前,我是學習Visual Basic 6與ASP,為什學這兩樣?也沒有什麼特別的原因,學校教什麼,我們就學什麼,而且從Visual Basic 6接ASP(VB Script)還很順,所以在使用ASP上還算順手。

後來,微軟登高一呼:「我們要進入.NET的世界!」然後推出了.NET Framework 1.0,那時的ASP由2.0到3.0,ASP 3.0之後微軟也很明確表示,ASP不再更新維護了,因為微軟要全力推「.NET」這個…產品嗎?概念嗎?程式語言嗎?反正那時候認為是新一代的ASP就是了。

我還很認真的去買書來看,結果一個月後我就放棄了,那ASP.NET 1.0是什麼鬼東西,看不懂,結果我又回到ASP的身邊,反正工作上也只用的到ASP,會不會ASP.NET也不影響工作。

一段時間又過去了,突然發現,怎麼大家又在推「ASP.NET 2.0」,而且這一次好像又不一樣了,Survey之後發現,.NET Framework 2.0是個全新的改版,不同於.NET Framework 1.0 / 1.1,而且微軟似乎也發現開發人員的辛苦,承諾未來的改版會使用「積木式」方式來改版,就是說,你學了.NET Framework 2.0的東西,拿到.NET Framework 3.0 / 3.5 / 4.0上一樣都可以使用,讓你不會天天做打掉重練的工作。就是這一點,讓我試著相信它,開始學習著ASP.NET 2.0。

另外在.NET Framework 2.0還有一項重要事,那就是開發工具的完備,那是在.NET Framework 1.0 / 1.1所沒有的。在.NET Framework 2.0有Visual Studio 2005 / 2008兩個版本,我學ASP.NET 2.0時已經是Visual Studio 2008版本,就Visual Studio 2008來開發ASP.NET 2.0而言,還蠻快樂的。

[Key Point 1].NET Framework → .NET Framework 2.0

故事2--LINQ to SQL


時間飛快,在學習.NET Framework 2.0不久,.NET Framwork 3.0推出,3.0還沒有什麼感覺,又不久之後,馬上再推出.NET Framework 3.5,這個3.5版的推出又是一個高潮 ,因為它提供了幾個重要的元素「LINQ + AJAX + REST」,其中最紅的就是LINQ(Language-Integrated Query),LINQ是個統稱,內容幾項重要的技術內容LINQ to Object、LINQ to ADO.NET(LINQ to DataSet、LINQ to SQL)、LINQ to XML、LINQ to Entities。

如果有學LINQ,我相信其中的LINQ to SQL會是你的一項主力。不過,就在2008一篇「Update on LINQ to SQL and LINQ to Entities Roadmap」的微軟官方文章,給所有有學LINQ to SQL的人一顆炸彈,他們的一句「他們會很認真的聽取 LINQ to SQL 社群的聲音,然後好好的來加強我們的 Entity Framework 產品」嚇死了一堆人。

很明顯,他們將主力放在Entity Framework上面(可看成LINQ to Entities這一項),那LINQ to SQL呢?在.NET Framework 4.0有做一些錯誤修正,但請注意,他們已經很明顯未來會不斷加強的是Entity Framework,目前在.NET Framework 4.0裡的是Entity Framework 4.0,現在已經有Entity Framework 4.1版本可以下載安裝使用。

[Key Point 2] LINQ to SQL → LINQ to Entities → Entity Famework

故事3--Web Service


在ASP.NET 2.0時,提供了一個很棒的Web Services服務,也就是說,我可以把相關Function透過伺服器分享出來,分享給網路上其他需要的人使用。使用者只要引用我的Web Services,就可以立即擁有我所提供的服務。

Web Services好是好,但也是有一些問題,所以Microsoft在.NET Framework 3.5又提出了一個 REST,董大偉老師有篇介紹 REST 文章,可以知一二。

[Key Point 3] Web Service → REST

故事4-- ASP.NET MVC 2.0


在Visual Studio 2008 + .NET Framework 3.5時,微軟還推出了一個很重要的Web技術,即ASP.NET MVC 1.0,老實說,ASP.NET MVC 1.0我連碰都沒碰過,但我碰了ASP.NET MVC 2.0。ASP.NET MVC 2.0對我而言,感覺又回到寫ASP,再強調一下,是「感覺」,不是「回到寫ASP」,什麼感覺,是一種「操之在我」的感覺,但靈活度是ASP及ASP.NET完全比不上的感覺。

ASP.NET Web Form入門而言,實在好學好用,但當你要深入一些時,會發現就沒那怎容易,當你想把你的魔手伸的越深入,你就會發現Web Form的控制項越複雜。但一切一切問題在ASP.NET MVC身上都沒有,因為它根本沒有控制項!

不過想要學習、使用ASP.NET MVC,就我個人認為,不是件簡單的事,因為有許多觀念必須先行建立,物件導向程式設計、Visual Basic 9/10語法熟悉度、LINQ、.NET Framework Class…這些都會了,再學習ASP.NET MVC會比較輕鬆,不然走一步算一步是比較辛苦點。

最近,ASP.NET MVC 3又正式推出,在ASP.NET MVC 3裡有一個重點Razor View Engine,Razor是一個新的View Engine,在我們撰寫ASP.NET MVC 3時,它提供了更簡潔的語法。不過馬上就有人指出,使用Razor怪怪的,因為它會破壞MVC的規則,將Controller的內容放到View裡。但Razor也讓我們在撰寫View提供了很好的規範,不會整個畫面裡都是<% ~ %>的符號。

Razor最早是與另一套微軟免費入門網頁開發軟體WebMatrix所採用,後來可能覺的很不錯,所以在ASP.NET MVC 3.0也加入了Razor的支援。所以到了ASP.NET MVC 3.0你可以選擇使用<% ~ %>的Visual Basic語法,也可以使用Razor的@Code ~ End Code或@ViewData()之類的語法。

[Key Point 4] ASP.NET MVC 1.0 →  ASP.NET MVC 2.0 / 3.0, Razor View Engine

整理一下Key Point

  1. [Key Point 1] .NET Framework 1.0 → .NET Framework 2.0
  2. [Key Point 2] LINQ to SQL → LINQ to Entities
  3. [Key Point 3] Web Services → REST
  4. [Key Point 4] Web Form → ASP.NET MVC
每個技術背景都有故事,在.NET Framework的裡的每個進步,都是為了解決一些前一代的一些問題或提供更好的解決方案。我們不能怪微軟說,為什麼說放就放,說改就改,而是要去思考及了解前因後果,當然不是每件事的回答或解釋都讓開發人員滿意。

由以上來看,.NET Framework到目前為止,所推出的第一代技術都會被第二代技術替代,其實這是必然的結果,只是改的太兇,苦的是這是程式開發人員。但我們在每一項新技術推出之時,每篇文章、專欄、ABC大會、XYZ研討會…你都只會聽到「優點」,但我在意的是「缺點」呢?例如,這一篇「對Entity Framework Performance 抱怨以及建議」,說明Entity Framework 1.0版實在不怎麼樣,但現在的Entity Framework 4.0到是沒聽到這種聲音了,原因前提過了,Entity Framework是現在的主力。而缺點,通常會在一段時間,實際使用於專案上之後,才會出現。

如果你現在才要進入.NET Framework的世界,我個人是建議,如果是那種「最新」的技術,有精力再去研究,如果是第二版之後改進的技術,通常是可以上場見世面了。了解每一項技術所提供的優點及缺點,所以當我聽完優點後,會靜一靜,等等看市場上有沒有其他聲音。以上是我個人就我在.NET Framework/ASP.NET的學習上的驗經談。我的時間、精力有限,所以在.NET Framework/ASP.NET這條路,我是選擇走「老二哲學」。

Reference:

Tool -- H3Viewer,我最推薦的MSDN閱讀及管理工具

MS Help 1.1


MS Document Explorer

H3Viewer

我們安裝了Visual Studio 2010之後,內附的說明文件檢視器會是MS Help 1.0版,但你會發現,當你安裝了Visual Studio 2010之後,開始「程式集」裡依然有Visual Studio 2008的目錄,當你打開目錄內的「Microsoft Visual Studio 2008 文件」會開啟的是「MS Document Explorer」,不過如果你有安裝MS SQL Server,它會開啟的是MS SQL Server的說明文件,而非Visual Studio的說明文件。

MS Help 1.0用的很不順手,後來Visual Studio 2010 Service Pack 1做了一些改進,改為MS Help 1.1版,還是沒有MS Document Explorer來得好用,所以現在我好的選擇是「H3Viewer」文件檢視器。

H3Viewer的正體中文是由小弟翻譯,此次算是正式介紹。首先,你必須使用Visual Studio 2010的「說明 → 管理說明設定」,


你可以選擇使用「線上」或「本機」,選擇使用「本機」等於是「離線版」,跟好久好久以前,每一季MS都會寄一次MSDN光碟來,然後我們就會很高興的安裝最新版本的MSDN到Notebook上一樣。現在HDD容量都很大,我個人是先考慮使用本機說明,如找不到才使用線上說明。

選擇使用本機說明,必須指定的安裝Disk,記的空間要大,基本上10GB來安裝就很夠了。然後選擇「從線上安裝內容」,


按「加入」,把你想加入的Document按「加入」,然後按「更新」,即會把線上的文件安裝到你本機。然後,我們下載「H3Viewer」來安裝使用。安裝完,系統依然預設會使用MS Help 1.1,你必須先使用「系統管理員」來啟動H3Viewer,然後修改預設檢視器,


這樣未來就會預設啟動H3Viewer。

H3Viewer軟體使用


H3Viewer軟體使用,不一定要啟動Visual Studio 2010,而是在你想查詢文件時就可以開啟使用,不過一般而言,還是邊使用Visual Studio 2010 + H3Viewer機會多些。


當我們尋找String關鍵字時,會出現一頁List,從List進入後,我們可以使用上面的Navigation來開啟或關閉導覽列,讓我們在同一個相關類別、屬性、方法中快速查詢。左邊的「Sync TOC」會幫我們進行「目錄同步」,


這樣你就能使用「Navigation導覽」與「Contents目錄」之間快速查詢同類與非同類資料。再左邊的「Find」可提供「高亮度提示」,讓我們查詢文件時,可更快速找到重點,可不要小看Find的高亮度提示,MSDN的文件,可不是每一篇都像我們範例圖String屬性一樣短短的。


Menu導覽列是另一好用的功能



可以快速切換到你想去的地方,不用像使用Online MSDN一直在那裡上上下下的拉來拉去。

Index功能


不多說了,即打即搜。

Bookmarks功能


這個功能對我個人而言,是整個核心,如果你很習慣查詢MSDN,但很討厭的是MSDN沒有一個線上Bookmarks功能,雖然可以整理在瀏覽器書籤,但你知道,使用MSDN就是一直從A篇跳到X篇再跳到F篇接著又是P篇…,你就整天在瀏覽器裡「我的最愛」裡找來找去,跳來跳去,眼都花了。



H3Viewer在建立和加入書籤上,沒有那麼的直覺,你必須先再最外層目錄建立你要的「分類目錄」,

然後點擊進入想要加入的分類目錄中,再按Bookmark所帶出的視窗中Folder路徑會會自己加上你所選擇的分類目錄。

修改字型



預設是Default,CHS Font與CHT Font的預設值是給我作者的建議值,如果你不是很喜歡,或是想修改為你「看的順眼」的字型,可以修改:「C:\Program Files (x86)\Helpware\H3Viewer」(Windows 7 x64)之下的「h3viewer.ini」檔裡第一段[Style]:

[Style]
Default=*
Arial=           font-family:Arial,Verdana
Calibri=         font-family:Calibri,Arial,Verdana
Cambria=         font-family:Cambria,Arial,Verdana
Courier New=     font-family:Courier New,Arial,Verdana
Georgia=         font-family:Georgia,Arial,Verdana
Lucida Console=  font-family:Lucida Console,Arial,Verdana
Segoe UI=        font-family:Segoe UI,Arial,Verdana
Tahoma=          font-family:Tahoma,Arial,Verdana
Times New Roman= font-family:Times New Roman,Arial,Verdana
Trebuchet MS=    font-family:Trebuchet MS,Arial,Verdana
Verdana=         font-family:Verdana,Arial

Black Font=      color:#000000;font-family:Segoe UI,Verdana,Arial;
Blue Font=       color:#003E6A;font-family:Segoe UI,Verdana,Arial;

CHS Font = font-family:宋体,simsun,nsimsun,黑体,simhei,楷体,simkai,仿宋,simfang
CHT Font = font-family:新細明體,PMingLiu,標楷體,DFKai-sb,細明體,MingLiu,微軟正黑體,Microsoft JhengHei

H3Viewer會依順序搜尋系統內是否有設定的字型,如果你想使用「標楷體,DFKai-sb」來閱讀文件,那就把「標楷體,DFKai-sb」改為「font-family:」後的第一順位,然後重開H3Viewer即可。

Online MSDN


這一個也是最重要的一個。你使用了「Help Library管理員」下載了不管多少的離線版文件,總是會少東少西,離線版的資料完整度不會與線上版一模一樣,不要以為你把整個MSDN文件庫的抓下來了!我們還是有很大的機會查詢線上版的資料。

例如,我們在學習ASP.NET MVC或想找正體中文的SQL Server線上叢書資料時,你就會發現,在離線版裡,像ASP.NET MVC一丁點資料都查不到,而且不管是英文版還是中文版資料,這時你就必須使用線上版來查詢。


第一次選擇使用Online時,我們可以先選擇要使用的「介面」及「語系」,然後按下「Open Online」,


例如,我們要找ASP.NET MVC 3的文件,那必須在「語系」選擇「en-us」,因為ASP.NET MVC 3的文件還沒有正體中文版,


備份H3Viewer我的最愛



在「My Help Viewer Bookmark」按左鍵,選擇「Explore Folder」,即可開啟所在目錄,


只要備份此目錄下所有目錄,即可備份H3Viewer的書籤,另我們也可以與Internet Explorer的我的最愛整合,選擇「Go to IE Favorites folder」,這樣你在按「Bookmark」加入書籤時,就會以IE我的最愛為目標來存放。目前只支援IE,如未來能支援其他瀏覽器的書籤建立,再透過書籤同步工具,那就太棒了。

「IE 匯出 → 其他瀏覽器匯入 → 書籤同步工具」,這有點費工。

當你備份好H3Viewer書籤後,你如果有多台電腦,即可把此備份目錄複製到另一台有安裝H3Viewer的電腦相同目錄之下,即可共用此書籤,此手動方法是呆呆式方法,但我喜歡。

一個好的工具,能讓你在學習時有加分的效果。H3Viewer是我目前最推薦使用的MSDN閱讀及管理工具。

Reference:

使用ASP.NET MVC 3 RTM原始碼進行錯誤追蹤

本篇英文原文在:「Tracing ASP.NET MVC 3 RTM Source Code」小弟轉譯為正體中文版,並新增ASPX檢視引擎步驟。我的步驟以Visual Basic專案為主,檢視引擎用選擇使用Razor或ASPX,所需要引的原始碼專案及修改不同,所以分為兩部分,相同的步驟,我使用Visual Basic專案,可正常執行及追蹤錯誤。


另外,ASP.NET MVC 3 RTM Source Code都是使用C#撰寫,所以你必須有能看懂C#的能力。

使用Rzaor view engine

  1. CodePlex 下載 ASP.NET MVC 3 RTM Source Code,然後解壓縮。
  2. 在 Visual Studio 2010中,新增一個「ASP.NET MVC 3 Web 應用程式」專案(C#或Visual Basic都可)。
  3. 在 Visual Studio 2010 → 檔案 → 加入 → 現有專案 (由原始碼專案引用下列五個專案):System.Web.MVC (在 \mvc3-rtm-sources\mvc3\src 之下)、System.Web.Razor、System.Web.WebPages、System.Web.WebPages.Deployment、System.Web.WebPages.Razor (在 \mvc3-rtm-sources\webpages\src\ 之下)。

  4. 移除原System.Web.Mvc.dll參考。(在Visual Basic專案,必須先按「顯示所有檔案」才會出現「參考」資料夾,然後移除之)。

  5. 新增參考:在「參考」資料夾按右鍵 → 加入參考 → Projects → Solution → System.Web.Mvc。

  6. 按Ctrl + F5,執行專案,參考錯誤訊息。

    G:\Temp\VS\root\dc9d0955\1bea8b5d\App_Web_index.vbhtml.a8d08dba.0akkfrmq.0.vb(33) : error BC30560: 'WebViewPage' 在命名空間 'System.Web.Mvc' 中模稜兩可。
    
            Inherits System.Web.Mvc.WebViewPage
    
  7. 修改根目錄下Web.config,將<assemblies>區段中 System.Web.Mvc 及 System.Web.WebPages 的「Version, Culture, PublicKeyToken」三個值內容移除。<add assembly="System.Web.Mvc" /> <add assembly="System.Web.WebPages" />

    原始設定:
    <compilation debug="true" targetFramework="4.0">
          <assemblies>
            <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
          </assemblies>
        </compilation>
    

    修改後設定:
    <compilation debug="true" targetFramework="4.0">
          <assemblies>
            <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Mvc" />
            <add assembly="System.Web.WebPages" />
          </assemblies>
        </compilation>
    
  8. 按Ctrl + F5再執行一次,參考錯誤訊息。

    System.InvalidCastException: [A]System.Web.WebPages.Razor.Configuration.HostSection 無法轉型為 [B]System.Web.WebPages.Razor.Configuration.HostSection. 型別 A 源自 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 
    
  9. 修改 /Views/Web.config,將 <configSection>下的<configSections>區段所有Type值中的「Version, Culture, PublicKeyToken」三個值內容移除。將<configSection>下的<system.web.webpages.razor>下<host> 裡factoryType值中的「Version, Culture, PublicKeyToken」三個值內容移除。

    原始內容:
    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
          <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
          <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
        </sectionGroup>
      </configSections>
    
      <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
          </namespaces>
        </pages>
      </system.web.webPages.razor>
    

    修改後的內容:
    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor">
          <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor" requirePermission="false" />
          <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor" requirePermission="false" />
        </sectionGroup>
      </configSections>
    
      <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc" />
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
          </namespaces>
        </pages>
      </system.web.webPages.razor>
    
  10. 按Ctrl + F5再執行一次,你可以看到ASP.NET MVC 3專案已經順利執行,現在你已經可以使用ASP.NET MVC 3 RTM 原始碼在除錯模式中進行追蹤。


使用WebForm view engine (ASPX)


使用WebForm view engine (ASPX)步驟上差不多,都是

  1. 加入原始檔專案
  2. 移除System.Web.Mvc.dll
  3. 重新加入參考(只需引用一個)
  4. 修改相關Web.config設定

  1. 從 CodePlex 下載 ASP.NET MVC 3 RTM Source Code,然後解壓縮。
  2. 在 Visual Studio 2010中,新增一個「ASP.NET MVC 3 Web 應用程式」專案(C#或Visual Basic都可)。
  3. 在 Visual Studio 2010 → 檔案 → 加入 → 現有專案 (由原始碼專案引用一個專案):System.Web.MVC (在 \mvc3-rtm-sources\mvc3\src 之下)。
  4. 移除原System.Web.Mvc.dll參考。(在Visual Basic專案,必須先按「顯示所有檔案」才會出現「參考」資料夾,然後移除之)。
  5. 新增參考:在「參考」資料夾按右鍵 → 加入參考 → Projects → Solution → System.Web.Mvc。
  6. 修改根目錄下Web.config,將<assemblies>區段中 System.Web.Mvc 的「PublicKeyToken」的值修改為「null」內容移除。

    原始內容:
    <compilation debug="true" targetFramework="4.0">
          <assemblies>
            <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
          </assemblies>
        </compilation>
    

    修改後的內容:
    <compilation debug="true" targetFramework="4.0">
          <assemblies>
            <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null" />
            <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
          </assemblies>
        </compilation>
    
  7. 修改 /Views/Web.config,將 <System.Web>下的<Pages>區段所有含System.Web.Mvc值中的「PublicKeyToken」的值改為「null」(請注意,這裡與Razor不同)。

    原始內容:
    <pages
            validateRequest="false"
            pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
            pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
            userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
          <controls>
            <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
          </controls>
        </pages>
    

    修改後內容:
    <pages
            validateRequest="false"
            pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null"
            pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null"
            userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null">
          <controls>
            <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null" namespace="System.Web.Mvc" tagPrefix="mvc" />
          </controls>
        </pages>
    
  8. 重新建置,然後按 Ctrl+F5,就可以看到我們正常運作的ASP.NET MVC 3網頁。
  9. 設定中斷點。我們設定在HomeController.vb的「ViewData("Message") = "歡迎使用 ASP.NET MVC!"」這一行。
  10. 按下 F5。由「呼叫堆疊」來反追原始碼。



這樣我們就完成了ASP.NET MVC 3 RTM Source Code Tracing in Razor and ASPX的目的。

Web.config修改差異

如果你細心的話,可以看出,第一個方法是刪除「「Version, Culture, PublicKeyToken」三個值,第二個方法是修改「PublicKeyToken=null」,第二種方法在Razor也行。我這裡引用ASP.NET MVC 2 開發實戰」書中第328頁中的解譯:

由於Visual Studio 2010預設的ASP.NET MVC專案範本會加入註冊GAC的System.Web.Mvc組件參考,而註冊在GAC的組件都會設定公開金鑰語彙基元(PublicKeyToken),其內容是將組件或應用程式簽名時的公開金鑰,以SHA-1雜湊運算後取得最後8位元組。

自己加入的System.Web.Mvc組件參考到我們現有的ASP.NET MVC專案,所以,在Web.config如果載入System.Web.Mvc組件時,若有設定公開金鑰語彙基元的話,就會導致專案日的System.Web.Mvc組件與GAC裡面的System.Web.Mvc組件發生重複載入命名空間衝突的錯誤。
看沒(台),沒關係,這不影響我們學習ASP.NET MVC。記得,如果要使用ASP.MVC原始碼Debug,使用修改「PublicKeyToken=null」是比較快速的修改方式。

Reference:

Tools -- 快速轉譯HTML特殊符號

我們寫技術性Blog文章,常常需要內嵌一些範例程式碼,但這些程式碼常常會包含一些「被過濾」的符號,例如< (左角括弧),如果只有幾個,用手打對應轉譯編碼比較快,例如,< 對應 &lt;;> 對應 &gt;。但常常不是這樣,一個範例程式碼超過十行、二十行不在少數,而且常常裡面會被過濾符號又一大堆(因為都是Code),少打到一個轉譯碼都不行。

這時手打就不是有效率的方法,我們應該多多善用工具。今天介紹一個快速轉譯HTML相關符號編碼的網頁:

Quick Escape


使用起來很簡單,把你要轉譯的程式碼Copy & Paste,第一個「Conver line breaks」勾選的話,會幫你在斷行處加上 <br />,第二個「Conver spaces to &nbsp;」勾選的話會幫你把半型空白轉為 &nbsp;。

完成設定後,按下「Convert to escaped characters」,


你無聊的話,可以比較看看,你用手打轉換和使用Quick Escape可以省下多少時間。

Reference:

人生無常

出生的喜稅,與失去的痛苦,好像無法畫上等號,因為出生沒有失去的數十年的情感

最近「人生無常」這個詞,跟著我太緊了,實在有許多感觸,讓我留下一二回憶吧!

人生如夢,夢如人生

我這一生,到目前為止真正面對過死亡有二次,第一次是車禍,但沒有什麼感覺,那時住了7天的加護病房轉一般病房時,女朋友(現在的婆婆)問我,有什麼感想?我說,我一定前途光明,因為整個加護病房只有我一個病人會打開眼睛,而且不管什麼時間,加護病房的燈總是好亮。

那第二次呢?第二次是一個很特別的情況,在夢裡。最近,我常常會進入一個深度長夢,什麼是深度長夢?一是這個夢的時間都很長,二是第二天不會有睡不好的感覺。而且這些夢境精彩度都不會輸電影。夢,各位也知道,常常是醒來就忘了,不過總有幾個是那麼特別。

特別的夢有讓我「哭醒的」、「嚇醒的」、「笑醒的」」。嚇醒的是鬼故事,我就不說了。哭醒的是感情事,我也不說了。笑醒的請參考我這篇「連做夢都在笑」。還有一類是「預知型」,就是,你幾個月、幾年後會發生的事,就先在夢裡做一次給你看,這種夢都不長,而且這種夢就醒來就忘,但等到那個時間點你就會突然跟自己說,現在這些人、事、物不就是我那時的夢境嗎!不過這個預知型的夢,隨著年紀的增長,已經很久沒有發生過了。

最後一種,是「感動-哭醒的」。

尋寶遊戲

這是最近一個深度長夢的內容,因為是感動哭醒的,所以內容大致記得。

有一個富翁,留下了一大筆的財富,這筆財富大到「富可敵國」。而富翁死後,將這筆財富藏了起來,而且還設計機關,讓人可以來找尋這筆財富。這個機關設計是,你必須找來二十個人闖關,但從來沒有成功。我,也就要那筆財富,所以我就去找個19個人連我也一起來闖關。

闖關的內容大致是這樣,每關在一個房間內,由一人進去闖關,每關闖關方式都一樣,進去關卡內會有一張圖,而且關卡會跟這張圖一模一樣,你必須在時間限制之內,找出相異之處,過了就進入下一關,沒過,這個人會被處罰。(很像大家來找喳)

關卡越後面,難度會越來越難。剛開始,大家還覺得沒有什麼,但等到後面幾關,大家才發現,每個關卡都是精心設計,也因為關卡越來越難,所以引發大家更多更深入的討論,大家才發現,每個關卡的內容,都會與來闖關之人習習相關。每個關卡都是為了讓這些人深思、反省。

第19關,差異點在一個很細小的地方,在一個神明的臉,因為必須進行送神及請神的儀式,就是這關不只找到差異點,還必須把圖片上的正確的神明請來,才算過關,而且關主還允許我提前闖第20關,等到請完神明,才開始計時,送神及請神的儀式完成的時間要24小時。所以我可以有24小時加一點點時間,來完成第20關。

一開始我很高興,這19個人都能在時間內通過關卡,我怎麼可能過不了,眼看財富將要得手,而且我們這些人經過前面關卡的深細及反省,已經有所改變,我應該能過關。

闖關開始,一開始我傻眼,第20關必須完成20張圖,難怪會給我24小時的時間。隨著時間一分一秒過去,我發現這20張圖,比前面19張都還要難,於是我轉頭要求其他19個人的幫忙,但那19個人已經在開Party,好像已經得到財富似的,又回到紙醉金迷人性面,我越來越緊張,因為以現在的進度,要在24小時內完成這20張圖是不可能的。

終於,時間到來,我沒有完成這20圖的關卡,突然有一個小姐出現在我面前,小姐跟我說,前19關如果沒過關,處罰都不大,但也因為我們很順利的過關,所以已經忘了處罰這件事了。但第20關的處罰是,「你必須去死!」

這時的我,整個人嚇傻,然後開始痛哭,我開始後悔,為什麼要貪心這筆財富,腦袋裡開始出現一幕幕畫面,隨著畫面的過去,我哭的越來越慘,畫面一幕幕的在我的不是,就在最後要執行處罰時,我好像悟到了什麼,有一句話突然出現在我心裡,而且這句話好像是是關主在對我說的感覺,他說:「人生無常」。

後來我就醒來,慢慢坐起,然後就哭了起來。

在夢裡,當那位小姐說:「你必須去死!」時,那就死亡的感覺,比車禍那一次還強烈千倍,萬倍。其實在夢裡,我和其他19個人和我都是社會敗類,但就像夢裡情節一樣,前19關都是讓這19個人深思、反省,給了大家一個懺悔的機會,但到了20關需要大家合作時,由於大家還是被金錢沖昏了頭,所以我只能獨立闖關,受到最大的處罰,去死。

身體有異

也是最近的事,就是我身體常常不舒服,但去醫院去檢查,也查不出個所以然。這常常會讓我想到那句「人生無常」。我改變一些生活作習,最重要的是不熬夜。又常常在Facebook上看到國中同學,因為罕見疾病所受到的身、心、靈的煎熬,更讓我不時回憶我的求財夢,我的那句「人生無常」。同學加油!如果你接下去看的話。因為「只要呼吸就好!」

白髮送黑髮

一早,收到妹妹facebook傳來惡耗,說我一位乾哥,在工作中不幸過世了。這個乾哥和我哥是同學,因為感情非常好,也受到乾哥媽媽的疼愛,所以就認了乾媽,而乾媽和我媽媽又一拍即可,更是親上加親,只要我媽超過三天沒去乾媽家,乾媽就會打電話來罵人。

讓我停一下…

海綿寶寶有一集,在與一個酷型男學衝浪,那位酷型男只講了一句:「只要呼吸就好!」

只要呼吸就好!一個多簡單的要求。除了不捨,我心中又是那一句「人生無常」。

生生死死,是我這個年紀要面對的事實。還好,我自認為我的生人少有遺憾,我還在學習更正確的人生態度,更正確的「生活方式」,照顧好自己與家人,誰都不知道,下一秒會發生什麼事。人生無常,這就是真實人生。



這是我非常非常愛的一首歌,我跟婆婆說過,如果我走了,放這首歌,一直Replay就可以了。

Reference:

育嬰假是德政,是上天的禮物

近來「金剛帶小孩」及「小孩帶金剛」的篇數甚少,原因很簡單,我們家的黑暗女王從良了,現在是光明大公主。從第二個寶貝出生後,她就乖乖在家帶小孩,而且一次二個,依中華民國法律規定,三歲前可以請「育嬰假」,而且前六個月有六成薪資。

二個寶貝一前一後,剛好可以申請一年的支薪育嬰假。這些育嬰假的日子,可以說,我們過的幸福又快樂。在這些月子中,我和媽咪常碰到申請育嬰假的父母親(9成是母親),有很多申請一個月或二、三個月後就馬上回去上班,原因絕大多數都是:「帶孩子比較辛苦」。反觀光明大公主,可能是由安親班的黑轉至育嬰假的明,所以帶孩子對她來說,得心應手,只有她搞小孩,沒有小孩搞她那一套。當我們碰到退育嬰假的父母親說,都會問我們說:「小孩不會難帶嗎?帶小孩不辛苦嗎?」

光明大公主說:「不會呀,帶小孩多好玩、多快樂呀!」當我們這樣回答時,她們的眼睛裡都是問號?好像是說,真的嗎?想法不同,觀念不同,做法不同,得到的就不同。這是我的心得。

我知道,一個全職的媽媽是辛苦的,全職媽的工作量不會比上班少,而且還有可能更多更累,但還好,光明大公主樂在其中。這近一年來,真是辛苦妳了。

老大童語錄


大公主:大寶貝,妳明天想吃什麼菜?
大寶貝:我想吃粉圓。
大公主:好,沒問題,還有沒有其他想吃的?
大寶貝:我想吃棒子。
大公主:吃棒子?為什麼妳想吃棒子?
大寶貝:因為,我把棒子吃光光,妳就不會拿棒子「愛」(台)我了。
大公主:笑聲不斷中~

老二翻床錄


我們家老二胃口好,睡的好,所以成長的也好。可能是有姐姐可以學習,所以如果用進度來計算,她的成長與學習速度,都比姐姐要快20%左右。老二二個多月左右,就會翻身。她是先會爬再會坐,跟七坐八爬相反,是六爬七坐,九已經快衝出去了。

今天大公主說,她在床上跟大寶貝一起看書時,老二居然從從小床爬了上來。說明一下,老二現在九個月,她的小床是一般小朋友睡的可上下兩層的嬰兒床,老二的床緊緊貼在我們的床邊,因為老二已經會翻及站,所以很早之前就都睡下層。

這讓我驚訝,孩子的成長真的是等比級數。