關於Mvc與WebForm的優缺點在網上的評論可謂不勝枚舉,但脫離了我們的項目來談這些意義就不大了。以我們這次改版來看,WebForm的優勢有以下幾點:
一,可以使用<#include>,css、html與js可以實現跨頁面乃至誇項目的重用,Mvc沒有發現此類功能;
二,可以精確的調用用戶控件中的屬性、字段、函數並可以獲得相應的返回值,Mvc也未發現此類功能;
三,可以方便的將公共或保護性字段屬性函數等應用到aspx頁面上,Mvc無法直接調用控制其中的相應字段屬性等。
針對以上WebForm的有點或Mvc的確點,我們在改版商鋪寫字樓時遵循了下面的幾個規范予以彌補:
一,使用局部視圖來實現html的重用;
二,對控制器中所用到的屬性字段函數進行合理的封裝,如將原有的變量集成到一個大的類中作為一個強類型視圖傳遞的對象傳給相應的視圖,實現在視圖中的方便使用。在這里對於類的划分需要盡可能的把相關性比較高的放到一塊兒,優先采用類的組合而非繼承,若需要放到視圖對象中的字段是一個較大的復合類,如經紀人實體或房源實體,建議單獨存放在ViewBag中。這些做法的目的比一方面希望這些變量使用起來更加方便,另一方面減小在視圖中調用局部視圖或函數的時候傳遞參數的顆粒度,也就提高了這些局部視圖或函數的重用性,如用經紀人實體做參數的函數我們既可以在商鋪寫字樓中用,也可以用在普通的經紀人詳情頁中使用,而視圖對象做參數無法實現這點;
三,將代碼的重用單位放到對象和函數上,原則上不在控制器中創建不直接向瀏覽器做交代的函數,而是放在底層以方便重用。
在遵循了上述一些規范之后方才發現Mvc還是有些優點的:
一,優秀的Razor引擎使得在視圖中使用C#代碼更加方便流暢;
二,單個視圖可以對應多個控制器,提高了代碼的重用;
三,在主視圖的ViewBag或ViewData中存儲的對象可以在局部視圖(僅限通過RenderPartial方式渲染的視圖)或母版頁中使用;
四,可以在視圖中以函數方式重用普通的html代碼到局部視圖中且可以向局部視圖中傳遞一個對象;
五,視圖與控制器的分界更加清晰,局部視圖的重用可以直接在視圖中予以調用,而在WebForm中用戶控件在后台代碼中由於需要傳參綁定而無法放在底層實現更高的重用。
除了上面的異同,還有一些在WebForm與Mvc中名字相同的對象,這些對象雖然名字相同,但是類型已經不是一個類型了,如:
1 // 2 // 摘要: 3 // 為當前 HTTP 請求獲取 System.Web.HttpRequestBase 對象。 4 // 5 // 返回結果: 6 // 請求對象。 7 public HttpRequestBase Request { get; } 8 // 9 // 摘要: 10 // 為當前 HTTP 響應獲取 System.Web.HttpResponseBase 對象。 11 // 12 // 返回結果: 13 // 響應對象。 14 public HttpResponseBase Response { get; }
1 // 2 // 摘要: 3 // 獲取請求的頁的 System.Web.HttpRequest 對象。 4 // 5 // 返回結果: 6 // 當前與該頁關聯的 System.Web.HttpRequest。 7 // 8 // 異常: 9 // System.Web.HttpException: 10 // System.Web.HttpRequest 對象不可用時發生。 11 [Browsable(false)] 12 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 13 public HttpRequest Request { get; } 14 // 15 // 摘要: 16 // 獲取與該 System.Web.UI.Page 對象關聯的 System.Web.HttpResponse 對象。該對象使您得以將 HTTP 響應數據發送到客戶端,並包含有關該響應的信息。 17 // 18 // 返回結果: 19 // 當前與該頁關聯的 System.Web.HttpResponse。 20 // 21 // 異常: 22 // System.Web.HttpException: 23 // System.Web.HttpResponse 對象不可用。 24 [Browsable(false)] 25 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 26 public HttpResponse Response { get; }
由於類型不同,在Mvc中一些特性不再靈驗,如在controller里面不能識別Response.End()頁面會繼續運行下面的代碼,可以用return null來代替。另外也添加了一些好玩的屬性函數如Request.IsAjaxRequest(),該函數可以用來判斷是否異步訪問。但畢竟相應對象的類型依然共用一個基類,它們的大多數屬性函數用法依然相同。目前對相應對象的各種新的用法了解還是很有限,需要在今后的工作中加以總結,以最大化的發揮出框架的優勢。
就現在的改版來說,我們做的尚不夠好,但依然可以發現,在MVC中我們用的代碼更少,重用的地方更多了。其實無論是MVC還是WebForm只要能夠合理的使用都可以獲得較高的效率及可維護性,要想提高代碼的可維護性及性能還是需要我們定制並完善統一的標准,同時也要提高我們的個人水平。
