在ASP.NET MVC不像ASP.NET裡有很多很多很好用的控制項,所以在ASP.NET MVC中「手工」部份比重增加,所以「重覆」、「客制化」的東西就多,這時有幾種方式來解決
- 寫個Function()來處理重覆步驟。
- 寫個Class,使用Shared關鍵字來公開方法。
- 使用擴充方法,直接擴充相關型別的方法。
寫個Function()來處理重覆步驟
如果Function()程式只會在同一個頁面,或同一個Class中使用,這是很不錯的方法。但如果需要給多個頁面,或多個Class使用,那還不是「重覆中的重覆」,只是一個是複製整段程式碼,一個是複製Function(),有何差別?寫個Class,使用Shared關鍵字來公開方法
自己寫個Class,使用Shared關鍵字來共用方法,這真好。因為使用了Shared關鍵字,在任何頁面或Class中都可以直接引用。但,你知道整個.NET Framework有多少Class了嗎?記得在一篇文篇裡看過,.NET Framework 2.0就有三萬多個Class,你背得了幾個?再加.NET Framework 4新增的,媽媽咪呀。你覺得不夠用,想要再往上加,你記的起來,別人呢?
使用擴充方法,直接擴充相關型別的方法
使用擴充方法(Extension Method)來擴充相對應型別的方法。一般常用的Class你一定記得起來,例如,String、Integer,當這些Class所提供的方法無法滿足你時,你應該使用擴充方法來擴充即可。例如,我們想要把使用者輸入的「數字字串」轉換為「中文數字字串」,「1234」轉為「一二三四」,String型別有這個方法嗎?Integer型別有這個方法嗎?沒,所以我們來擴充。
使用擴充方法
- 必須寫在「模組」裡,模組必須定義為「Public」
- 必須 Imports System.Runtime.CompilerServices
- 擴充方法只能是 Function 或 Sub
- 擴充方法 Function 或 Sub 前,必須以「擴充屬性 <extension()> 標記
- 擴充方法 Function 或 Sub 第一個參考型別表示要擴充的型別
實作擴充方法 for ASP.NET MVC
在ASP.NET與ASP.NET MVC實作擴充方法都一樣,讓我們寫點ASP.NET MVC的東西,所以我們選擇使用ASP.NET MVC來實作。新增ASP.NET MVC 3專案
如果你使用Visual Basic來撰寫ASP.NET MVC我建議升級至ASP.NET MVC 3版本,最少在「產生程式碼片段」會不出現$end$的錯誤。
' ASP.NET MVC 2 產生程式碼片段 Public Function Action() As ActionResult Return View()$end$ End Function ' ASP.NET MVC 3 產生程式碼片段 Public Function Action() As ActionResult Return View() End Function
在Controllers資料夾中新增二個「模組」,命名為StringExtension,還有一個LabelExtension(Label這個有個故事)。
StringExtension.vb 模組
Imports System.Runtime.CompilerServices ' 一定Public,不然會出錯 Public Module StringExtension ' 第一個參數為String,所以會擴充為String的方法 ' Visual Basic 2010,有「隱含行接續」,可不行在最後加「底線」Public Function ToChineseFromNumber(ByVal number As String) As String Dim letter As String = Nothing Dim Chinese As String = "" Dim value As Integer = Nothing If (Integer.TryParse(number, value)) Then For i As Integer = 0 To number.Length - 1 letter = number.Substring(i, 1) Select Case letter Case "0" Chinese += "零" Case "1" Chinese += "一" Case "2" Chinese += "二" Case "3" Chinese += "三" Case "4" Chinese += "四" Case "5" Chinese += "五" Case "6" Chinese += "六" Case "7" Chinese += "七" Case "8" Chinese += "八" Case "9" Chinese += "九" End Select Next Else Chinese = "Must Numbers." End If Return Chinese End Function End Module
LabelExtension.vb 模組
Imports System.Runtime.CompilerServices Public Module LabelExtension ' 擴充HtmlHelper,即在View中使用Html,擴充後成為Html.LabelFormat()方法 <extension()> Public Function LabelFormat(ByVal helper As HtmlHelper, ByVal target As String, ByVal text As String) As String Return String.Format("<label for="{0}">{1}</label>", target, text) End Function End Module
先「建置」專案,然後開啟HomeController.vb,加入擴充方法所在的命名空間「Imports ProjectName.ModuleName」:
HomeController.vb
' 要記得Imports ProjectName.ModuleName Imports MvcVBExtension.StringExtension Public Class HomeController Inherits System.Web.Mvc.Controller Function Index() As ActionResult ViewData("Message") = "歡迎使用 ASP.NET MVC!" Dim Chinese As String = "1234" ' 使用String的擴充方法 ViewData("Chinese") = Chinese.ToChineseFromNumber() Return View() End Function Function About() As ActionResult Return View() End Function End Class
接著我們來看Index.aspx
<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <%@ Import Namespace="MvcVBExtension.LabelExtension" %> <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> 首頁 </asp:Content> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <h2><%: ViewData("Message") %></h2> <p> 若要進一步了解 ASP.NET MVC,請造訪 <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>。 </p> <p> String擴充方法:<%: ViewData("Chinese")%> </p> <p> Label擴充方法:<%= Html.LabelFormat("KKBruce", "Bruce Blog")%> </p> </asp:Content>
重點在第二行「<%@ Import Namespace="MvcVBExtension.LabelExtension" %>」,先Imports 命名空間,才有辦法使用Html.LabelFormat擴充方法。
.NET Framework進化到現在4.0,除非需求特別,不然需要再寫新Class的機會實在不大,反而是需要擴充的機會大些,而在ASP.NET MVC中擴充Helper輔助類別又是大宗。
LabelExtension的故事呢?
話說,有些人就是學不乖,犯過了寫,而且還寫了「悔過書--JavaScript之無法form.submit()的錯誤」,2010/12月到現在2011/3月,算算應該才滿三個月的時間,又犯一樣的錯,抓去關算了。什麼錯,就之前寫擴充方法寫的很高興,但奇怪,怎麼有一個擴充方法怎麼樣就是不能用?在<%= Html. 時,就是不會跑出我寫的那個擴充方法,但你直接下<%= LabelFormat就可以使用,不管我如何清除、重建,就是無法成為HtmlHelper的擴充方法。想說是不是見鬼了,也查了我一整個下午,結果是:
看不懂,沒關係,答案是:
還看不懂我也沒辦法了。命名重覆,哈,我的腦袋跟這些人一樣嗎?怎麼老是想出一樣的名稱。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。