|
介紹: 我很早之前就開始從事Asp.NET的開發(fā)工作,我也比較喜歡使用WebForms來開發(fā)Web程序。在2008年,微軟推出了一個(gè)叫Asp.NET MVC的東西,我當(dāng)時(shí)和很多人一樣很好奇為什么還要再推出一個(gè)全新的Asp.NET技術(shù)呢。許多人說Asp.NET MVC代替了Asp.NET WebForms,但事實(shí)并非如此。它們兩者各有優(yōu)劣,雖然沒有人告訴過我們該如何選擇哪種技術(shù)來開發(fā)web程序,但是我們可以討論一些關(guān)鍵事實(shí)來幫助我們以后作出選擇。本篇文章便是對兩種技術(shù)的介紹。
101208287024026.png (27.49 KB)
下載附件
2014-10-11 09:10 上傳
101209106717014.png (59.59 KB)
下載附件
2014-10-11 09:10 上傳
我們同時(shí)也找到以下問題的答案, - Asp.NET是什么?
- Asp.NET WebForms是什么?
- MVC是什么?
- Asp.NET MVC是什么?
如果您是一個(gè)非常有經(jīng)驗(yàn)的Asp.NET MVC開發(fā)者,且已經(jīng)非常了解MVC,那么這篇文章將會(huì)讓您重新復(fù)習(xí)一下與之相關(guān)的概念。
目錄: - 談?wù)劇翱梢暬?li>Web技術(shù)
- Web開發(fā)中的“可視化”
- 什么是Asp.NET?
- 什么是Asp.NET WebForms?
- Asp.NET 4.0
- 什么是MVC?
- 什么是Asp.NET MVC?
- 如何選擇Asp.NET WebForms和Asp.NET MVC?
- 總結(jié)
1.談?wù)劇翱梢暬?/strong>
101213177807041.png (34.91 KB)
下載附件
2014-10-11 09:10 上傳
微軟最初推出一個(gè)概念叫“可視化”,在一些“可視化技術(shù)”諸如Visual Basic、Visual C++等的支持下,微軟實(shí)現(xiàn)了圖形用戶程序(Graphical User Applications)的快速開發(fā)(RAD)。“拖”、“拽”、“智能感知”等技術(shù)也使得開發(fā)者能夠?qū)⒕性谙到y(tǒng)的業(yè)務(wù)邏輯處理中而非UI界面開發(fā)上。但是,這種“可視化”的技術(shù)僅僅限制于桌面應(yīng)用程序開發(fā)(即Windows桌面程序,譯者注),當(dāng)涉及到Web程序開發(fā)時(shí),微軟只能選擇ASP。
2.Web技術(shù) 當(dāng)我們談到Web技術(shù)時(shí),有我們熟悉經(jīng)典的ASP,PHP,JSP,ASP.NET WebForms,ASP.NET MVC等等。經(jīng)典的ASP是微軟推出的Web技術(shù)之一。ASP最大的難點(diǎn)是它的“意大利式”的代碼風(fēng)格不利于后期維護(hù),我們假設(shè)這樣一個(gè)場景:有一些TextBox文本輸入框和一個(gè)按鈕,當(dāng)你點(diǎn)擊按鈕時(shí),后臺會(huì)驗(yàn)證文本框中的輸入數(shù)據(jù),如果驗(yàn)證成功,則將輸入數(shù)據(jù)存入數(shù)據(jù)庫;否則,在頁面顯示一個(gè)紅色的錯(cuò)誤提示。你知道這個(gè)場景中最大的問題嗎?你必須自己手工做許多事情: 1.首先創(chuàng)建一個(gè)“自我提交”式頁面,即將表單Form的Action屬性值設(shè)置為頁面本身(自己處理表單中的數(shù)據(jù),譯者注); 2.當(dāng)你點(diǎn)擊提交按鈕時(shí),TextBox控件中的值會(huì)被清空,所以后臺獲得用戶輸入的唯一方式便是從頁面提交的表單數(shù)據(jù)集中去查找(注意Post方式和Get方式的區(qū)別,譯者注); 3.如果后臺驗(yàn)證數(shù)據(jù)失敗,你必須顯示地: 1)將提交的數(shù)據(jù)一一對應(yīng)地賦給每個(gè)TextBox控件(維持頁面上一次的狀態(tài),譯者注); 2)顯示錯(cuò)誤提示信息。 (使用Ajax是一種驗(yàn)證數(shù)據(jù)的方式,這里我僅僅是為了舉例來說明在經(jīng)典的ASP開發(fā)中,我們必須手工完成的工作)
3.Web中的“可視化” 像諸如Visual Basic這樣的可視化技術(shù)的使用場合單一,當(dāng)開發(fā)Web程序時(shí),微軟只能選擇經(jīng)典的ASP。當(dāng)我們討論WEB和DESKTOP時(shí)(這里應(yīng)該是Web程序和桌面程序,譯者注),我們應(yīng)該考慮兩件事: 1.狀態(tài)管理是如何進(jìn)行的? 2.請求/回復(fù)是如何進(jìn)行的? Web程序是基于“無狀態(tài)”的HTTP協(xié)議(有關(guān)無狀態(tài)的真實(shí)定義,參見博主前面的文章,譯者注)的,前后兩次請求之間沒有任何關(guān)聯(lián),它不像桌面程序那樣既可以有臨時(shí)變量來存儲狀態(tài),同時(shí)也完全地遵守“事件驅(qū)動(dòng)模型”。與桌面程序類似,Web程序也需要等待用戶的輸入,但不同的是Web程序中,用戶的每次請求之間都是相互獨(dú)立的,即每次Request和Response都是全新的。最后,微軟推出了一個(gè)叫Asp.NET WebForms的東西,它被當(dāng)做一個(gè)新的RAD工具并且也很容易掌握。
4.什么是Asp.NET? Asp.NET是微軟發(fā)布的一款基于CLR的Web程序開發(fā)框架,可以使用多種語言,比如C#、VB.NET等。它支持兩種開發(fā)模式:Asp.NET WebForms和Asp.NET MVC。
101217468277370.png (48.78 KB)
下載附件
2014-10-11 09:10 上傳
5.什么是WebForms? 微軟最開始發(fā)布基于ASP的Asp.NET WebForms技術(shù)的目的是為了幫助Web開發(fā)者創(chuàng)建一個(gè)“無狀態(tài)Web”之上的抽象層,它能夠模擬“有狀態(tài)”的特性(類似桌面程序開發(fā),譯者注)。在WebForms中引進(jìn)了類似“自我提交”(將表單數(shù)據(jù)提交到頁面本身)、ViewState(在頁面提交時(shí)保存控件值)等概念。最有趣的是我們甚至不用寫任何一行代碼(一個(gè)網(wǎng)站就能運(yùn)行起來,譯者加),在Asp.NET WebForms中,微軟試圖將類似Visual Basic這種可視化的(桌面,譯者加)開發(fā)模式引入到Web開發(fā)中。
101219297805090.png (39.23 KB)
下載附件
2014-10-11 09:10 上傳
那么現(xiàn)在我們來談?wù)刉ebForms的優(yōu)缺點(diǎn)。 (本文中一切WebForms都指“Asp.NET WebForms”,譯者注) 優(yōu)點(diǎn): 當(dāng)我們跟HTML打交道時(shí),我們可能會(huì)發(fā)現(xiàn),頁面顯示效果并不是始終是一樣的(瀏覽器兼容差異,譯者注)。在IE中看起來很好的UI效果再FireFox中很可能出現(xiàn)“錯(cuò)位”或者其他變化。Asp.NET 服務(wù)器控件能夠區(qū)分不同的瀏覽器,對應(yīng)地產(chǎn)生與之相匹配的HTML代碼,如果有需要,JavaScript也可能會(huì)額外產(chǎn)生。 許多類似GridView或者ListView等服務(wù)器控件具備“數(shù)據(jù)綁定”的能力,這大大減少了我們的工作量。(雖然數(shù)據(jù)綁定很爛,呵呵,譯者注) 你可能經(jīng)常聽見“HTTP是一種無狀態(tài)協(xié)議”這樣的話,通常情況下,在兩次請求之間,頁面的控件(這里指HTML控件,類似input等,譯者注)是不能夠自己保存自己的狀態(tài),但是在WebForms中,有一種被叫作ViewState的東西能夠以隱藏域(hidden filed)的形式存在于靜態(tài)網(wǎng)頁中,它能夠保存任何一個(gè)服務(wù)器控件的狀態(tài)。 在以下技術(shù)的幫助下,微軟在Internet世界中引入的事件驅(qū)動(dòng)編程。 1.Code Behind 2.自我提交(將表單數(shù)據(jù)提交給自己處理) 3.ViewState 開發(fā)者在后臺處理用戶輸入數(shù)據(jù)時(shí),不再依賴于Post方式還是Get方式。比如TA只需要拖拽一些控件(如Button)到頁面中,然后雙擊添加事件處理程序,再在自動(dòng)生成的代碼中編寫業(yè)務(wù)邏輯,這是開發(fā)者所需要做的東西,TA完全不用去考慮底層到底發(fā)生了什么(如怎樣從提交的數(shù)據(jù)集合中獲得用戶的輸入、怎樣保存頁面控件的狀態(tài)等等,這些全部由系統(tǒng)完成,開發(fā)者只需要像開發(fā)桌面程序(如WInform)那樣去開發(fā)Web程序。譯者注) 我認(rèn)為再?zèng)]必要詳細(xì)解釋這個(gè),上面三條足以能夠說明WebForms能夠加快Web程序的開發(fā)速度。它相當(dāng)于在傳統(tǒng)Web開發(fā)的基礎(chǔ)上封裝了一個(gè)抽象層,開發(fā)者無需去弄清楚底層復(fù)雜過程。 使用強(qiáng)大的服務(wù)器控件和ViewState后,開發(fā)者只需要掌握少量的HTML和JavaScript知識。 缺點(diǎn):
101223581712817.png (196.16 KB)
下載附件
2014-10-11 09:10 上傳
當(dāng)使用WebForms開發(fā)Web程序時(shí),并沒有一種預(yù)先定義好的統(tǒng)一項(xiàng)目架構(gòu),開發(fā)者可以隨意地選擇他們喜歡的架構(gòu)。一些人可能選擇三層架構(gòu)(UI層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層),而另外一些高手可能更喜歡Model-View-Presenter(MVP)。甚至我們可以將所有的代碼都寫在Code Behind文件(.cs文件,譯者注)中,很明顯,這不是一個(gè)好的編程習(xí)慣。 在WebForms中,Code Behind文件中包含許多的事件處理程序,這使得自動(dòng)單元測試變得相當(dāng)艱難。 注:據(jù)我所知,即使在一些模仿測試的幫助下(如使用MOQ或者rhinomoq),我們也幾乎模擬不出來事件處理程序中的兩個(gè)參數(shù)(sender和eventargs)(sender一般代表激發(fā)事件的控件,譯者注)。
101225137659844.png (68.11 KB)
下載附件
2014-10-11 09:10 上傳
ViewState雖然解決了經(jīng)典ASP技術(shù)面臨的一些問題(如無法自動(dòng)保存頁面狀態(tài),參見前面,譯者注),但它同時(shí)也帶來了許多問題,ViewState以Hidden Field的形式存在于網(wǎng)頁中,隨網(wǎng)頁一起來回傳輸,這無疑增加了頁面數(shù)據(jù)量從而降低性能。
101226289216272.png (79.77 KB)
下載附件
2014-10-11 09:10 上傳
我們來看看另外一個(gè)需要?jiǎng)?chuàng)建兩個(gè)UI界面的例子: 1)需納稅員工界面 2)無需納稅員工界面 這兩個(gè)頁面的Code Behind代碼中有許多的邏輯是相同的。一種做法就是只創(chuàng)建一個(gè)UI頁面,在該頁面的Code Behind中增加一些if的判斷語句。但這樣做會(huì): 1)這違背了單一職責(zé)原則(SRP) 2)Secondly it may possible that both UI(沒清楚原文啥意思,譯者注) 在WebForms中,我們很難確定最終顯示在用戶瀏覽器中的HTML代碼是怎樣的(因?yàn)榇蟛糠?/i>HTML代碼由系統(tǒng)自動(dòng)生成,譯者注),這使得我們很難在頁面中使用一些JavaScript庫,比如JQuery等。 URL都是指向固定的aspx頁面(附帶一些查詢參數(shù)),這降低了用戶親和度也影響了SEO。 aspx頁面和Code Behind代碼緊密相連,所以多人很難同時(shí)去開發(fā)一個(gè)頁面(比如一個(gè)人開發(fā)aspx頁面而另外一個(gè)人編寫Code Behind代碼)。
6.Asp.NET 4.0 Asp.NET 4.0推出了許多新特性去解決上面提到的一些問題 提供了一種可以控制ViewState大小甚至禁用ViewState的方法(但是并沒有一個(gè)確定或者強(qiáng)制性的規(guī)則要求開發(fā)者去這樣做)。 提供了一種可以代替頁面物理地址的方法。 在Asp.NET 4.0中,我們能夠更好的控制頁面控件的ID,這樣以來,我們可以更好地去使用一些類似Jqeury的腳本庫(但是我們還是不能完全去控制自動(dòng)產(chǎn)生的HTML)。 即使在Asp.NET發(fā)生了革命性的更新后: 1)它還是沒能解決單元測試遇到的問題 2)我從沒看見某個(gè)人去禁用ViewState(個(gè)人觀點(diǎn),呵呵) 3)我們可以更好地去操控頁面HTML,但是仍然不能完全控制,依舊不能徹底地應(yīng)用JavaScript腳本庫。
7.什么是MVC? MVC是一種已經(jīng)出現(xiàn)了很久的架構(gòu)模式。很多人在Java中使用到它,它并不是微軟提出來的心概念。雖然Asp.NET MVC是我們本次討論的主題,但是我覺得在那之前,我們應(yīng)該先搞清楚一些技術(shù)概念。 簡單來說,模式是我們解決一個(gè)問題的解決方案。 架構(gòu)模式指在子系統(tǒng)級別上解決問題的方式,它主要解決與項(xiàng)目架構(gòu)有關(guān)的問題。它告訴我們怎樣劃分系統(tǒng)甚至為什么要這樣劃分。我們按照要求創(chuàng)建類庫、組件或者Web服務(wù)來解決最終的問題。 當(dāng)我們討論系統(tǒng)時(shí),它一般包含用戶輸入邏輯、業(yè)務(wù)處理邏輯以及UI顯示邏輯等,MVC是一種架構(gòu)模式,它能夠讓我們開發(fā)出各個(gè)模塊之間松耦合的應(yīng)用程序。MVC最主要的目的是“關(guān)注點(diǎn)分離”,它能夠分離開UI顯示、業(yè)務(wù)邏輯以及用戶輸入等。根據(jù)MVC的規(guī)定,一個(gè)系統(tǒng)應(yīng)該被劃分為Model、View以及Controller三個(gè)部分:
101229456088160.png (25.67 KB)
下載附件
2014-10-11 09:10 上傳
- Model:它被當(dāng)做一個(gè)可以處理業(yè)務(wù)規(guī)則、邏輯以及數(shù)據(jù)的智能體,同時(shí)它獨(dú)立于MVC中其它兩個(gè)部分(C和V)(不訪問Controller和View,譯者注)
- Controller:它負(fù)責(zé)接收用戶請求、分配請求給處理者,它可以訪問Model和View。
- View:它被當(dāng)做一個(gè)啞巴,專門呈現(xiàn)最終的數(shù)據(jù)給用戶。它可以是一個(gè)excel表單,也可以是一個(gè)包含許多記錄的web頁面甚至是一個(gè)純文本。它可以訪問Model。
8.什么是Asp.NET MVC?
101231193584801.png (37.98 KB)
下載附件
2014-10-11 09:10 上傳
Asp.NET MVC是微軟的一種新的Web程序開發(fā)框架,主要強(qiáng)調(diào)了功能模塊的分離以及易測試性。它運(yùn)行在CLR之中并以MVC為基礎(chǔ),它不再支持ViewState和服務(wù)器控件,所以我感覺回到了傳統(tǒng)Web開發(fā)。我們來討論一下Asp.NET MVC的優(yōu)缺點(diǎn): 優(yōu)點(diǎn):
101232379681818.png (16.37 KB)
下載附件
2014-10-11 09:10 上傳
Asp.NET MVC的優(yōu)點(diǎn)之一便是它強(qiáng)制要求功能塊的分離,所以把東西搞得復(fù)雜多樣的情況很少。
1)在MVC中,Controller是一個(gè)單獨(dú)的類,所以自動(dòng)測試稱為可能 2)Controllers不依賴于任何View,所以它完全能夠被多個(gè)View重用。 Asp.NET MVC不支持ViewState,因此它不會(huì)增加頁面數(shù)據(jù)大小。 Asp.NET MVC不支持服務(wù)器控件,只能使用HTML控件。用戶在瀏覽器看到的HTML與我們在開發(fā)階段編寫的幾乎一致,在開發(fā)階段能夠?qū)TML元素進(jìn)行很好的操控,因此我們可以很好的使用到第三方腳本庫比如JQuery等。 在Asp.NET MVC中,各個(gè)部分都是松耦合的,一個(gè)人可以負(fù)責(zé)Controller、另外一個(gè)一個(gè)負(fù)責(zé)View,而第三個(gè)人可以負(fù)責(zé)Model。 - SEO, URL routing and REST
豐富的URL路由特性讓我們可以把每個(gè)URl都當(dāng)做一個(gè)資源。同時(shí)URL的易讀性也增加了用戶親和度并且有利于SEO。 Asp.NET MVC中支持多視圖引擎。 由于Asp.NET MVC是基于成熟的Asp.NET框架的,因此原有的許多優(yōu)秀特性都可以繼續(xù)試用,如Windows身份驗(yàn)證、Session等等。 缺點(diǎn): 事件驅(qū)動(dòng)以及ViewState的缺失使Asp.NET MVC不再簡單易學(xué),尤其對于一些沒有Web開發(fā)經(jīng)驗(yàn)的人。
9.Asp.NET MVC運(yùn)行機(jī)制
101235259529971.png (83.78 KB)
下載附件
2014-10-11 09:10 上傳
1.用戶使用URL請求服務(wù)器 2.請求先進(jìn)入Controller(路由引擎決定一個(gè)請求應(yīng)該由哪個(gè)Controller處理,本文未談及此內(nèi)容) 3.如果有需要,Controller會(huì)訪問Model來獲取數(shù)據(jù) 4.Model訪問數(shù)據(jù)庫,并且數(shù)據(jù)返回給Controller 5.Controller選擇一個(gè)合適的View(比如包含HTML表格頁面) 6.Controller將數(shù)據(jù)(第4步由Model返回的)傳給第5步選擇的View 7.Controller將View發(fā)送給用戶(瀏覽器)。 以上只是Get方式的請求,Post方式類似。唯一的區(qū)別就是,用戶不是在地址欄中輸入U(xiǎn)RL,而是在已返回的頁面上點(diǎn)擊按鈕等操作,之后服務(wù)器端的處理流程類似。
10.如何選擇Asp.NET WebForms還是Asp.NET MVC? 對于一個(gè)特定的系統(tǒng)或者一個(gè)特定的團(tuán)隊(duì)成員組成,兩者都有可能稱為“最好的選擇”。當(dāng)面臨選擇其中的一種技術(shù)作為開發(fā)平臺時(shí),了解兩者的技術(shù)優(yōu)劣非常重要。 當(dāng)你要做出選擇時(shí),有兩個(gè)非常重要的因素是: 1.RAD(Rapid Application Development) 如果你想快速開發(fā)出系統(tǒng)(比如一個(gè)演示demo,譯者注),Asp.NET WebForms是你最好的選擇,你甚至根本不用考慮使用Asp.NET MVC去實(shí)現(xiàn)“快速開發(fā)”。 2.單元測試 對于你的系統(tǒng),如果自動(dòng)單元測試非常重要,那么Asp.NET MVC是你的選擇。 除了上面2條,你最好將你項(xiàng)目的需求寫下來,然后再比較WebForms和MVC的優(yōu)缺點(diǎn),如果可以的話,你可以試圖問問自己以下問題: 1.你的團(tuán)隊(duì)有很好的WebForms或者Windows Forms開發(fā)經(jīng)驗(yàn)嗎? 嗯,如果回答是正確的,那么讓你的團(tuán)隊(duì)再去學(xué)習(xí)Asp.NET MVC將是一件困難的事情,因?yàn)樗麄円呀?jīng)熟悉了事件驅(qū)動(dòng)編程以及習(xí)慣了ViewState,“改變習(xí)慣”是一件很艱難的工作。這時(shí)候,給Asp.NET WebForms投上一票。 2.你的團(tuán)隊(duì)有很好的Asp.NET MVC開發(fā)經(jīng)驗(yàn)嗎? 回答如果是,投Asp.NET MVC一票。 3.你的團(tuán)隊(duì)有ASP經(jīng)驗(yàn),或者一些非微軟技術(shù)(Android、ios、JSP、ROR、PHP)開發(fā)經(jīng)驗(yàn)嗎? 如果你曾經(jīng)是一個(gè)ASP或者JSP開發(fā)者,那么你可能很熟悉HTTP的兩種請求方式(GET和Post),你甚至也很了解MVC,因?yàn)槟切┘夹g(shù)大多數(shù)默認(rèn)采用了MVC。這時(shí)候投Asp.NET MVC一票。 4.JavaScript是否需要大范圍被使用? 如果是,那么投Asp.NET MVC一票,因?yàn)樗耆梢圆倏豀TML元素。 5.追求高性能嗎? Asp.NET MVC不支持ViewState,因此能夠有更好的性能。這時(shí)候投Asp.NET MVC一票。 6.計(jì)劃重用相似的輸入邏輯代碼嗎? 如果是,投Asp.NET MVC一票。
總結(jié) 我認(rèn)為,你應(yīng)該了解足夠的信息之后,再?zèng)Q定使用哪種技術(shù),而這些很大程度依賴于你的項(xiàng)目和你的開發(fā)團(tuán)隊(duì)。希望你們喜歡這篇文章,謝謝你們耐心閱讀本文。
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會(huì)員個(gè)人意見,與本論壇立場無關(guān)。2、本站對所發(fā)內(nèi)容真實(shí)性、客觀性、可用性不做任何保證也不負(fù)任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進(jìn)行交流。3、對提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請勿將該數(shù)字內(nèi)容進(jìn)行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問題與本站無關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時(shí)本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來,僅供學(xué)習(xí)用途使用,請務(wù)必下載后兩小時(shí)內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請及時(shí)聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|