標籤:style blog http color 使用 os io strong
一、ASP.Net的兩種開發模式1.1 ASP.Net WebForm的開發模式
(1)處理流程
在傳統的WebForm模式下,我們請求一個例如http://www.aspnetmvc.com/blog/index.aspx的URL,那麼我們的WebForm程式會到網站根目錄下去尋找blog目錄下的index.aspx檔案,然後由index.aspx頁面的CodeBehind檔案(.CS檔案)進行邏輯處理,其中或許也包括到資料庫去取出資料(其中的經過怎樣的BLL到DAL這裡就不談了),然後再由index.aspx頁面來呈現給使用者。
綜上所述,在WebForm模式下:一個URL請求的是在伺服器與該URL對應路徑上的物理檔案(ASPX檔案或其他),然後由該檔案來處理這個請求並返回結果給用戶端。
(2)開發方式
• 伺服器端控制項 • 一般處理常式+Html靜態頁+Ajax • 一般處理常式+Html模板引擎1.2 ASP.Net MVC的開發模式
(1)處理流程
在ASP.Net MVC中,用戶端所請求的URL是被映射到相應的Controller去,然後由Controller來處理商務邏輯,或許要從Model中取資料,然後再由Controller選擇合適的View返回給用戶端。再說回前面我們啟動並執行ASP.NET MVC程式訪問的http://www.aspnetmvc.com/Home/Index這個URL,它訪問的其實是HomeController中的Index這個Action。
(2)顯著特點
• 2009年第一個開源項目版本發布,至今已過去5年,發展逐漸完善 • 更加簡潔,更加接近原始的“請求-處理-響應” • 更加開發、更多的新的特點、社區活躍 • 不會取代WebForm • 底層跟WebForm都是一樣的,只是管道上不同的處理而已二、MVC模式的兩種不同解讀 MVC 模式兩種理解:一種是
表現模式,另外一種是
架構模式。它將應用程式分成三個主要組件即:視圖(View)、控制器(Controller)和模型(Model)。現在,我們來看看M-V-C分別代表什嗎?
M:Model 主要是儲存或者是處理資料的組件;Model其實是實現商務邏輯層對實體類相應資料庫操作,如:CRUD。它包括資料、驗證規則、資料訪問和商務邏輯等應用程式資訊。(補充:ViewModel:視圖模型)
V:View 是使用者介面層組件。主要是將Model中的資料展示給使用者。aspx和ascx檔案被用來處理視圖的職責;
C: Controller 處理使用者互動,從Model中擷取資料並將資料傳給指定的View; (1)MVC作為架構模式的理解 作為架構模式時,View的職責就是負責展示資料,而Controller則負責擷取View傳遞來的資料,然後調用商務邏輯層處理完成的資料傳遞給View進行展示。而Model則處理商務邏輯,並把結果返回給Controller。從傳統三層架構上來看,View和Controller都屬於UI層,而Model則橫跨BLL與DAL層。 (2)MVC作為表現模式的理解 (3)MVC架構模式綜合模型
可以看出,對於MVC的兩種不同理解的區別就在於對於Model的理解上:將Model作為業務模型(BLL、DAL等)還是作為視圖模型(ViewModel)。
三、WebForm vs MVC
(1)WebForm
優點: 1.提供了大量的伺服器端控制項,可以實現快速開發;
2.ViewState回傳資料很方便;
3.學習成本低;
缺點: 1. 封裝太強,雖然學習成本低,很多底層東西讓初學者不是很明白;
2. 自訂控制不靈活,不利於美工和開發人員的配合,往往那些伺服器控制項處理稍有不慎就會導致出錯;
3. ViewState在頁面中的傳遞會造成大量的流量消耗;
TIP:有關WebForm的伺服器控制項和ViewState的詳細介紹,不瞭解的朋友可以閱讀另一篇博文《ASP.Net WebForm學習筆記:aspx與伺服器控制項探秘》。
(2)MVC
優點: 1.很容易將複雜的應用分成Model(ViewModel)、View、Controller三個組件模型,將處理後台邏輯代碼與前台展示邏輯進行了很好的分離,屬於松耦合關係,在大項目應用中,更易于敏捷開發與測試驅動開發,有很強的可擴充性;
2.因為沒有伺服器端控制項,所以程式員控制的會更加靈活,頁面更加乾淨,沒有ViewState;
3.通過修改路由規則,可以控制產生自訂的url,因此控制產生SEO友好的URL將更加容易;
4.強型別View實現、Razor視圖、Model綁定機制、Model的驗證機制,更安全高效;
缺點: 學習成本高,結構複雜,對未變化資料的不必要的頻繁訪問,也將損害操作效能。
四、第一個ASP.Net MVC程式4.1 建立項目後的檔案組織圖
(1)建立一個ASP.Net MVC 4項目,選擇“基本”配置與“ASPX”視圖引擎(暫時不用Razor引擎)。
(2)VS為我們產生的基本檔案組織圖如所示:
可以看出,VS預設幫我們建立好了Models、Views以及Controllers的三個檔案夾,這三個檔案夾就構成了我們的ASP.Net MVC模式的項目。其中,Controllers是所有控制器的類檔案所在,而Models則是所有模型的類檔案所在,而Views則是所有cshtml或aspx的檔案所在。
4.2 控制器的“約定大於配置”
在Controllers中建立一個控制器,取名為HomeController。在預設的Index這個Action中建立一個視圖,預設名為Index即可。
(1)Controller放到controllers檔案夾中,並且
命名方式以Controller結尾
(2)
每個Controller都對應View中的一個檔案夾,檔案夾的名稱跟Controller名相同 (3)Controller中的方法名都對應一個View視圖(非必須,但是建議這麼做)而且
View的名字跟Action的名字相同 (4)控制器必須是非靜態類,並且要實現IController介面 (5)Controller類型可以放到其他項目中4.3 視圖的相關約定 (1)所有的視圖
必須放到Views目錄下 (2)不同控制器的視圖用檔案夾進行分割,
每個控制器都對應一個視圖目錄 (3)一般視圖名字跟控制器的Action相對應(非必須) (4)多個控制器
公用的視圖放到Shared:例如公用的錯誤頁、列表模板頁、表單範本頁等等;4.4 資料傳遞的橋樑-ViewData與ViewBag 首先,ViewData是一個
Key/Value對的字典集合資料結構,用於在Controller和View之間構建起傳遞資料的橋樑。 (1)ViewData是Controller的屬性,
此屬性是繼承ControllerBase而來。 (2)ViewPage下也有一個ViewData的一個屬性 (3)控制器的Action方法執行完成後,返回ViewResult,然後MVC架構在執行ExcuteResult方法時,Controller中的ViewData資料會傳遞給ViewPage類,其實就是
把Controller的ViewData賦值給ViewPage頁面的ViewData屬性。 (4)
ViewBag傳遞資料:我們對ViewBag的動態屬性進行賦值,
值實際上是存到了ViewData中,動態屬性的名存成了ViewDataDictionary的鍵,動態屬性的值存成了ViewDataDictionary的值。
PS:ViweBag其實是就一個包含了一層Dynamic的ViewData,兩個兄弟共用的是一個容器。
(5)ViewData與ViewBag的比較
| ViewData |
ViewBag |
| 它是Key/Value字典集合 |
它是dynamic類型對像 |
| 從Asp.net MVC 1 就有了 |
ASP.NET MVC3 才有 |
| 基於Asp.net 3.5 framework |
基於Asp.net 4.0與.net framework |
| ViewData比ViewBag快 |
ViewBag比ViewData慢 |
| 在ViewPage中查詢資料時需要轉換合適的類型 |
在ViewPage中查詢資料時不需要類型轉換 |
| 有一些類型轉碼 |
可讀性更好 |
(6)如何在程式中使用ViewData與ViewBag
①在Controller中的代碼
public ActionResult Index() { ViewData["Name"] = "Edison Chou"; ViewBag.Name = "Edison Chou"; return View(); }
②在View中的代碼
<body> <div> <h1>Hi,ASP.Net MVC First Demo!</h1> <% for (int i = 0; i < 5; i++) { Response.Write("Hello World!<br/>"); } %> <p><%: ViewData["Name"] %></p> <p><%: ViewBag.Name %></p> </div></body>4.5 路由機制初步瞭解
我們通過調試可以知道,在MVC中所有的請求都歸結到控制器下面的Action。所以,所有的請求都是要指定一個具體的Action,Url的格式是根據路由規則來定的。那麼,在ASP.Net MVC的路由規則預設又是什麼,在哪裡設定的呢?
public class RouteConfig{ public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }}
開啟App_Start檔案夾,可以找到RouteConfig這個類,查看RouteConfig這個類的方法,可以知道原來是RegisterRoutes這個方法為我們的ASP.Net MVC項目設定了預設的路由規則:{controller}/{action}/{id},也就是說我們可以通過http://localhost/Home/Index/1這種URL來訪問項目。如果我們想要改變預設的路由規則,例如我們想要以這種URL:http://localhost/Home-Index-1來訪問項目,則直接將上面的預設路由規則改為:{controller}-{action}-{id}即可。
參考文章
(1)lulu Studio,《ASP.Net MVC入門:1-簡介》,http://www.cnblogs.com/QLeelulu/archive/2008/09/30/1302462.html
(2)馬倫,《ASP.Net MVC基礎視頻教程》,http://bbs.itcast.cn/thread-26722-1-1.html
(3)深山老林,《正確認識WebForm與ASP.Net MVC》,http://www.cnblogs.com/wlb/archive/2009/12/07/1618954.html
(4)zhaojunpeng,《ViewData和ViewBag的那些事》,http://blog.segmentfault.com/zhaojunpeng/1190000000472818
周旭龍
出處:http://www.cnblogs.com/edisonchou/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。