国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

WebForms 與MVC對比

[復(fù)制鏈接]
樓主
(本文翻譯自CodeProject上阿三寫的一篇文章,原文地址:http://www.codeproject.com/Articles/528117/WebForms-vs-MVC,講了有關(guān)ASP、ASP.NET WebForms以及ASP.NET MVC三種技術(shù),這篇文章有助于ASP.NET初學(xué)者理解一些基本概念。)
介紹:
我很早之前就開始從事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ù)的介紹。
             WebForms 與MVC對比 101208287024026.png           WebForms 與MVC對比 101209106717014.png
我們同時(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>
WebForms 與MVC對比 101213177807041.png
微軟最初推出一個(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。
WebForms 與MVC對比 101217468277370.png

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ā)中。
WebForms 與MVC對比 101219297805090.png
那么現(xiàn)在我們來談?wù)刉ebForms的優(yōu)缺點(diǎn)。
本文中一切WebForms都指“Asp.NET WebForms”,譯者注
優(yōu)點(diǎn):
  • WebForms支持豐富的服務(wù)器控件
        當(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ù)綁定很爛,呵呵,譯者注
  • 支持ViewState
        你可能經(jīng)常聽見“HTTP是一種無狀態(tài)協(xié)議”這樣的話,通常情況下,在兩次請求之間,頁面的控件(這里指HTML控件,類似input等,譯者注)是不能夠自己保存自己的狀態(tài),但是在WebForms中,有一種被叫作ViewState的東西能夠以隱藏域(hidden filed)的形式存在于靜態(tài)網(wǎng)頁中,它能夠保存任何一個(gè)服務(wù)器控件的狀態(tài)。
  • 事件驅(qū)動(dòng)編程
        在以下技術(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程序。譯者注
  • RAD
        我認(rèn)為再?zèng)]必要詳細(xì)解釋這個(gè),上面三條足以能夠說明WebForms能夠加快Web程序的開發(fā)速度。它相當(dāng)于在傳統(tǒng)Web開發(fā)的基礎(chǔ)上封裝了一個(gè)抽象層,開發(fā)者無需去弄清楚底層復(fù)雜過程。
  • 學(xué)習(xí)簡單
        使用強(qiáng)大的服務(wù)器控件和ViewState后,開發(fā)者只需要掌握少量的HTML和JavaScript知識。
缺點(diǎn):
  • 項(xiàng)目架構(gòu)
WebForms 與MVC對比 101223581712817.png
當(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ā)事件的控件,譯者注)。
WebForms 與MVC對比 101225137659844.png
  • 性能
        ViewState雖然解決了經(jīng)典ASP技術(shù)面臨的一些問題(如無法自動(dòng)保存頁面狀態(tài),參見前面,譯者注),但它同時(shí)也帶來了許多問題,ViewState以Hidden Field的形式存在于網(wǎng)頁中,隨網(wǎng)頁一起來回傳輸,這無疑增加了頁面數(shù)據(jù)量從而降低性能。
  • 重用性
WebForms 與MVC對比 101226289216272.png
我們來看看另外一個(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(沒清楚原文啥意思,譯者注
  • 與HTML控件交互困難
        在WebForms中,我們很難確定最終顯示在用戶瀏覽器中的HTML代碼是怎樣的(因?yàn)榇蟛糠?/i>HTML代碼由系統(tǒng)自動(dòng)生成,譯者注),這使得我們很難在頁面中使用一些JavaScript庫,比如JQuery等。
  • SEO
        URL都是指向固定的aspx頁面(附帶一些查詢參數(shù)),這降低了用戶親和度也影響了SEO。
  • 不支持并行開發(fā)
        aspx頁面和Code Behind代碼緊密相連,所以多人很難同時(shí)去開發(fā)一個(gè)頁面(比如一個(gè)人開發(fā)aspx頁面而另外一個(gè)人編寫Code Behind代碼)。

6.Asp.NET 4.0
Asp.NET 4.0推出了許多新特性去解決上面提到的一些問題
  • ViewState
        提供了一種可以控制ViewState大小甚至禁用ViewState的方法(但是并沒有一個(gè)確定或者強(qiáng)制性的規(guī)則要求開發(fā)者去這樣做)。
  • URL路由
        提供了一種可以代替頁面物理地址的方法。
  • ID
        在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)模式
        架構(gòu)模式指在子系統(tǒng)級別上解決問題的方式,它主要解決與項(xiàng)目架構(gòu)有關(guān)的問題。它告訴我們怎樣劃分系統(tǒng)甚至為什么要這樣劃分。我們按照要求創(chuàng)建類庫、組件或者Web服務(wù)來解決最終的問題。
  • MVC
        當(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è)部分:
WebForms 與MVC對比 101229456088160.png
  • 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
WebForms 與MVC對比 101231193584801.png

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):
  • 項(xiàng)目架構(gòu)
WebForms 與MVC對比 101232379681818.png
      Asp.NET MVC的優(yōu)點(diǎn)之一便是它強(qiáng)制要求功能塊的分離,所以把東西搞得復(fù)雜多樣的情況很少。










  • 測試驅(qū)動(dòng)開發(fā)和重用
        1)在MVC中,Controller是一個(gè)單獨(dú)的類,所以自動(dòng)測試稱為可能
        2)Controllers不依賴于任何View,所以它完全能夠被多個(gè)View重用。
  • 性能
        Asp.NET MVC不支持ViewState,因此它不會(huì)增加頁面數(shù)據(jù)大小。
  • 對HTML的完全控制
        Asp.NET MVC不支持服務(wù)器控件,只能使用HTML控件。用戶在瀏覽器看到的HTML與我們在開發(fā)階段編寫的幾乎一致,在開發(fā)階段能夠?qū)TML元素進(jìn)行很好的操控,因此我們可以很好的使用到第三方腳本庫比如JQuery等。
  • 支持并行開發(fā)
        在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。
  • 擴(kuò)展性
        Asp.NET MVC中支持多視圖引擎。
  • 已有的Asp.NET特性
        由于Asp.NET MVC是基于成熟的Asp.NET框架的,因此原有的許多優(yōu)秀特性都可以繼續(xù)試用,如Windows身份驗(yàn)證、Session等等。
缺點(diǎn):
  • 不易學(xué)習(xí)
        事件驅(qū)動(dòng)以及ViewState的缺失使Asp.NET MVC不再簡單易學(xué),尤其對于一些沒有Web開發(fā)經(jīng)驗(yàn)的人。

9.Asp.NET MVC運(yùn)行機(jī)制
WebForms 與MVC對比 101235259529971.png

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ì)。希望你們喜歡這篇文章,謝謝你們耐心閱讀本文。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

手機(jī)版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 01:08

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復(fù) 返回頂部 返回列表