黃玉春
(安徽工業(yè)職業(yè)技術(shù)學(xué)院 信息工程系,安徽 銅陵 244000)
近年來(lái),越來(lái)越多的ASP.NET開(kāi)發(fā)人員開(kāi)始接觸MVC框架,開(kāi)始大都認(rèn)為MVC與ASP.NET完全沒(méi)有關(guān)系,是一個(gè)全新的Web開(kāi)發(fā),而事實(shí)上MVC是一種更高級(jí)架構(gòu)體系.原來(lái)的ASP.NET稱(chēng)為 ASP.NET WebForms,新的MVC 稱(chēng)為ASP.NET MVC.
ASP.NET是微軟推出的基于 .NET Framework的Web開(kāi)發(fā)平臺(tái),目前最新的版本是ASP.NET Core(也被稱(chēng)為 ASP.NET 5),是一個(gè)開(kāi)源跨平臺(tái)的開(kāi)發(fā)框架,用于構(gòu)建基于云的現(xiàn)代 Web 應(yīng)用 .它是從底層開(kāi)始重新構(gòu)建來(lái)提供性能優(yōu)良的Web應(yīng)用開(kāi)發(fā)框架,可以部署在云上或者本地服務(wù)器上.ASP.NET Core實(shí)現(xiàn)了真正的跨平臺(tái),用戶(hù)可以很容易的在Windows,Mac或者Linux上開(kāi)發(fā)和部署Web應(yīng)用,可以在云上部署和調(diào)試Web應(yīng)用.
但在開(kāi)發(fā)B/S結(jié)構(gòu)的Web應(yīng)用過(guò)程中,有一些開(kāi)發(fā)人員往往采用Web Forms開(kāi)發(fā)模式,該模式是一種事件驅(qū)動(dòng)模型,將業(yè)務(wù)邏輯和頁(yè)面顯示混合在一起,該模式不利于分工與協(xié)作,而且在業(yè)務(wù)邏輯中采用內(nèi)嵌SQL語(yǔ)句的方式完成數(shù)據(jù)訪問(wèn),一旦數(shù)據(jù)庫(kù)或者類(lèi)定義中一方發(fā)生變化,就會(huì)導(dǎo)致Web應(yīng)用系統(tǒng)的大量修改,不利于系統(tǒng)的維護(hù).
針對(duì)上述不足,對(duì)ASP.NET Core框架中的MVC開(kāi)發(fā)框架進(jìn)行探索,并通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明ASP.NET MVC的應(yīng)用.
Web Forms 是傳統(tǒng)的基于事件驅(qū)動(dòng)的 ASP.NET 模式.它整合了 HTML、服務(wù)器控件、服務(wù)器事件和服務(wù)器代碼的網(wǎng)頁(yè).在Visual Studio開(kāi)發(fā)環(huán)境中,開(kāi)發(fā)人員通過(guò)拖拽UI元素生成前臺(tái)頁(yè)面,在后臺(tái)編寫(xiě)操作這些UI元素的邏輯代碼的方式開(kāi)發(fā)Web Forms應(yīng)用程序.
Web Forms 請(qǐng)求流程如圖1所示.
ASP.NET Web Forms的HTTP請(qǐng)求處理過(guò)程是比較復(fù)雜的,但一般可以理解為經(jīng)過(guò)以下幾個(gè)步驟:
(1)瀏覽器發(fā)送http請(qǐng)求.
(2)轉(zhuǎn)交請(qǐng)求(把請(qǐng)求交給.NET FrameWork進(jìn)行處理.)
(3)創(chuàng)建頁(yè)面類(lèi)對(duì)象,返回給瀏覽器.
(4)瀏覽器解析html代碼,生成網(wǎng)頁(yè).
(1)有大量服務(wù)器控件支持,除了有用于設(shè)計(jì)界面和輸入驗(yàn)證的Web控件外,還有GridView、DataList、Repeater等控件可以方便地進(jìn)行數(shù)據(jù)綁定,從而減少了大量代碼的編寫(xiě).
(2)采用事件驅(qū)動(dòng)模式來(lái)控制應(yīng)用程序請(qǐng)求,如:Click事件等,aspx和cs文件分離,即顯示邏輯和處理邏輯分離.
(3)支持視圖狀態(tài),即通過(guò)ViewStates自動(dòng)保存Post返回的狀態(tài),每個(gè)控件以“隱藏域”的形式存在當(dāng)前表單頁(yè)面未達(dá)到“有狀態(tài)”.
(1)由于使用的ViewState會(huì)增加頁(yè)面的大小(一般會(huì)增加兩倍字節(jié)),造成性能不高,消耗大量帶寬.
(2)Web Forms加載時(shí)間明顯比MVC加載時(shí)間要長(zhǎng),大約是MVC加載時(shí)間的兩倍.
(3) 因?yàn)椴捎胏ode-behind 代碼后置技術(shù),每個(gè)aspx文件都包含.aspx和.aspx.cs兩個(gè)文件,緊密耦合度太高.
(4)因?yàn)榫o密耦合度太高、使用大量的事件處理函數(shù),不利于單元測(cè)試.
后臺(tái)代碼和服務(wù)器控件是ASP.NET Web Forms一切問(wèn)題的根源.MVC是一種使用Model View Controller(模型-視圖-控制器)設(shè)計(jì)創(chuàng)建Web應(yīng)用程序模式,微軟公司于2009年正式發(fā)布ASP.NET MVC.Controller中包含后臺(tái)代碼邏輯,View是ASPX,如純HTML代碼,Model是中間層.這三部分的關(guān)系如圖2所示.
圖1 WebForms頁(yè)面的運(yùn)行示意圖
圖2 ASP.NET Web Forms三層體系結(jié)構(gòu)與MVC對(duì)應(yīng)關(guān)系
通過(guò)研究可以發(fā)現(xiàn)MVC的改變有兩點(diǎn).一是View變成簡(jiǎn)單的HTML代碼,二是后臺(tái)代碼移到簡(jiǎn)單的.NET類(lèi)中,稱(chēng)為控制器.
ASP.NET MVC 請(qǐng)求流的通用步驟是:首先獲取控制器.其次依賴(lài)行為(Action)控制器創(chuàng)建Model對(duì)象,Model通過(guò)轉(zhuǎn)換調(diào)用數(shù)據(jù)訪問(wèn)層.最后數(shù)據(jù)填充Model之后,傳遞到View 顯示層,實(shí)現(xiàn)數(shù)據(jù)的顯示.
MVC由三大核心模塊組成:模型(Model),視圖(View)和控制器(Controller);其中,Model負(fù)責(zé)數(shù)據(jù)處理,是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分;View負(fù)責(zé)視圖呈現(xiàn),是應(yīng)用程序中處理數(shù)據(jù)顯示的部分;Controller負(fù)責(zé)處理視圖和模型之間的邏輯,是應(yīng)用程序中處理用戶(hù)交互的部分,通??刂破鲝囊晥D讀取數(shù)據(jù)、控制用戶(hù)輸入,并向模型發(fā)送數(shù)據(jù).MVC大致流程如圖3所示.
模型(Model)是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分,是MVC設(shè)計(jì)的核心,它封裝了系統(tǒng)的核心流程和業(yè)務(wù)規(guī)則,通常模型對(duì)象在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)和數(shù)據(jù)業(yè)務(wù)處理.
視圖(View)是Web應(yīng)用程序中處理數(shù)據(jù)顯示的部分,主要負(fù)責(zé)向用戶(hù)顯示相關(guān)數(shù)據(jù),并接受用戶(hù)的輸入數(shù)據(jù),但它并不實(shí)際處理這些數(shù)據(jù).通常從模型數(shù)據(jù)中創(chuàng)建視圖.一個(gè)視圖可以被多個(gè)控制器重用.
控制器(Controller)是應(yīng)用程序中處理用戶(hù)交互的部分,負(fù)責(zé)模型和視圖之間的同步,接受用戶(hù)從視圖輸入的數(shù)據(jù)并調(diào)用模型處理數(shù)據(jù),最后將處理結(jié)果返回到視圖.通常一個(gè)視圖具有一個(gè)控制器.
對(duì)于瀏覽器端的一個(gè)http請(qǐng)求,請(qǐng)求的是控制器的某一個(gè)Action方法,一般格式為:
http://localhost:8080/控制器名/方法名
控制器的Action方法接收后,服務(wù)器端存在一些判斷邏輯來(lái)處理這些請(qǐng)求,控制器用相應(yīng)的視圖呈現(xiàn)給用戶(hù).
對(duì)于瀏覽器端用戶(hù)通過(guò)一組輸入控件和提交按鈕組成的HTML請(qǐng)求,首先也是被控制器接收,通過(guò)對(duì)應(yīng)的Action方法決定相應(yīng)的模型處理請(qǐng)求并返回?cái)?shù)據(jù),最后控制器用相應(yīng)的視圖去格式化模型返回的數(shù)據(jù),并通過(guò)顯示頁(yè)面呈現(xiàn)給用戶(hù).
模型、視圖與控制器的分離,使得一個(gè)模型可以具有多個(gè)顯示視圖.如果用戶(hù)通過(guò)某個(gè)視圖的控制器改變了模型的數(shù)據(jù),所有其它依賴(lài)于這些數(shù)據(jù)的視圖都應(yīng)反映到這些變化.因此,無(wú)論何時(shí)發(fā)生了何種數(shù)據(jù)變化,控制器都會(huì)將變化通知所有的視圖,導(dǎo)致顯示的更新.這實(shí)際上是一種模型的變化-傳播機(jī)制.
MVC模式的出現(xiàn)不僅實(shí)現(xiàn)了功能模塊和顯示模塊的分離,同時(shí)它還提高了應(yīng)用系統(tǒng)的可維護(hù)性、可擴(kuò)展性、可移植性和組件的可重用性.MVC 的優(yōu)勢(shì)具體有以下幾點(diǎn):
(1)耦合性低.視圖層和業(yè)務(wù)層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼.同樣,一個(gè)應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需要改動(dòng)MVC的模型層即可.因?yàn)槟P团c控制器和視圖相分離,所以很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則.
(2)重用性高.隨著互聯(lián)網(wǎng)技術(shù)的不斷進(jìn)步,應(yīng)用程序的訪問(wèn)方式也越來(lái)越多.MVC模式允許多個(gè)視圖共享一個(gè)模型,因此允許使用各種不同樣式的視圖來(lái)訪問(wèn)同一個(gè)服務(wù)器端的代碼,用戶(hù)可以通過(guò)電腦也可通過(guò)移動(dòng)設(shè)備來(lái)訪問(wèn).MVC使開(kāi)發(fā)和維護(hù)用戶(hù)接口的技術(shù)含量降低.
(3)可維護(hù)性高.視圖層和業(yè)務(wù)邏輯層的分離也使得Web應(yīng)用更易于維護(hù)和修改.例如,業(yè)務(wù)邏輯和修改視圖可以分別修改,相互獨(dú)自,互不干擾.分層最大的好處就是容易后期維護(hù)降低維護(hù)成本,和增加新的功能,提高代碼重用性,從而提高開(kāi)發(fā)效率.
(4)不支持ViewState,這樣的頁(yè)面更加簡(jiǎn)潔,可以提升程序的性能.
(5)有利軟件工程化管理.由于不同的層各司其職,每一層不同的應(yīng)用具有某些相同的特征,有利于通過(guò)工程化、工具化管理程序代碼.
MVC有以下不足之處:
(1)對(duì) MVC 的準(zhǔn)確理解和把握并不是那么容易.運(yùn)用 MVC 需要精心的計(jì)劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費(fèi)一些時(shí)間去思考.
(2)MVC增加了系統(tǒng)結(jié)構(gòu)的難度和實(shí)現(xiàn)的復(fù)雜性.對(duì)于簡(jiǎn)單的界面,如果嚴(yán)格按照 MVC 設(shè)計(jì)模式,使模型、視圖與控制器分離,增加了結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過(guò)多的系統(tǒng)交互,降低運(yùn)行效率.
(3)MVC 理論上要求視圖和控制器的分離,但實(shí)際中總會(huì)存在一定程度的聯(lián)系.視圖與控制器是相互分離的部件,但確實(shí)聯(lián)系緊密,視圖沒(méi)有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣也會(huì)妨礙了他們的獨(dú)立重用.
本例以某高校教師課堂教學(xué)網(wǎng)上評(píng)測(cè)系統(tǒng)為例.
教師課堂教學(xué)是高等學(xué)校教學(xué)質(zhì)量保證的關(guān)鍵所在,建立科學(xué)、行之有效的課堂教學(xué)質(zhì)量評(píng)價(jià)體系是改善教學(xué)質(zhì)量的有效途徑.學(xué)院根據(jù)教育部印發(fā)的《高等職業(yè)院校內(nèi)部質(zhì)量保證體系診斷與改進(jìn)指導(dǎo)方案》,制定了學(xué)院教師課堂教學(xué)考核評(píng)教指標(biāo),教師課堂考核由學(xué)生通過(guò)網(wǎng)絡(luò)對(duì)教師課堂紀(jì)律、教學(xué)內(nèi)容、知識(shí)講解、語(yǔ)言表達(dá)等10個(gè)方面進(jìn)行評(píng)測(cè)打分.
該系統(tǒng)由學(xué)生測(cè)評(píng)模塊(前臺(tái)系統(tǒng))和管理員管理模塊(后臺(tái)系統(tǒng))兩部分組成.
前臺(tái)系統(tǒng),是學(xué)生通過(guò)手機(jī)登錄到評(píng)教頁(yè)面(也可以通過(guò)電腦登錄評(píng)教頁(yè)面,對(duì)應(yīng)的視圖也不一樣,對(duì)應(yīng)的業(yè)務(wù)邏輯是一樣的),對(duì)本班任課教師教學(xué)水平、教學(xué)效果進(jìn)行評(píng)價(jià),教師可以通過(guò)手機(jī)登錄系統(tǒng)查看學(xué)生對(duì)自己的教學(xué)評(píng)價(jià)結(jié)果.后臺(tái)系統(tǒng),管理員通過(guò)電腦端對(duì)課程、任課教師、學(xué)生、班級(jí)等信息的維護(hù).各模塊的主要功能如圖4所示.
圖3 MVC模型結(jié)構(gòu)圖
圖4 系統(tǒng)主要功能模塊
該系統(tǒng)使用SQL Server和EF(Entity Framework)創(chuàng)建相關(guān)的數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)訪問(wèn)層.EF使用代碼優(yōu)先(Code Ffirst)的方法實(shí)現(xiàn)項(xiàng)目,類(lèi)以及類(lèi)之間的關(guān)系通過(guò)代碼創(chuàng)建,當(dāng)應(yīng)用程序首次執(zhí)行時(shí),EF將在數(shù)據(jù)庫(kù)服務(wù)器中自動(dòng)生成數(shù)據(jù)訪問(wèn)層以及相應(yīng)的數(shù)據(jù)庫(kù).
(1)創(chuàng)建連接字符串(ConnectionString)
在Web.Config 文件中< Configuration >標(biāo)簽中添加如下代碼:
name="xspjDB" providerName="System.Data.SqlClient"/> (2)添加EF引用.在vs2013中安裝Entity Framework框架. (3)創(chuàng)建項(xiàng)目中所需實(shí)體類(lèi)和DbContext類(lèi).(建立了學(xué)生類(lèi),其他類(lèi)略) public class Student { [DisplayName("編號(hào)")] public int ID { get;set;} [DisplayName("學(xué)號(hào)"),Required] public string sCode { get;set;} [DisplayName("姓名"),Required] public string sName { get;set;} [DisplayName("班級(jí)編號(hào)"),Required] public string classID { get;set;} [DisplayName("班級(jí)")] public virtual Class Class { get;set;} } 創(chuàng)建數(shù)據(jù)訪問(wèn)層代碼: public class XspjDB:DbContext { public DbSet {get;set;} public DbSet {get;set;} … } 在Views 文件夾中創(chuàng)建與控制器同名的文件夾,在對(duì)應(yīng)的文件夾下創(chuàng)建視圖文件,視圖文件有html、aspx、cshtml等.本系統(tǒng)使用razor引擎視圖,擴(kuò)展名為cshtml,Razor 是一種標(biāo)記語(yǔ)法,用于將基于服務(wù)器的代碼嵌入網(wǎng)頁(yè)中.視圖頁(yè)使用HTML5、CSS3、JavaScript結(jié)合Bootstrap框架技術(shù).下面以系統(tǒng)常用的登錄模塊為例,登錄模塊視圖login.cshtml主要代碼如下: @using(Html.BeginForm()) { @Html.TextBoxFor(m => m.UserName,new { @class = "form-control",placeholder = "Enter UserName" }) @Html.ValidationMessageFor(m => m.UserName) @Html.PasswordFor(m => m.PassWord,new { @class = "form-control",placeholder = "Enter password" }) @Html.ValidationMessageFor(m => m.PassWord)3.3 視圖層的實(shí)現(xiàn)
學(xué)生實(shí)習(xí)管理系統(tǒng)
}
在該系統(tǒng)中,控制層的設(shè)計(jì)采用分散控制器的原則.頁(yè)面控制器捕獲每個(gè)視圖頁(yè)面中發(fā)生的事件和提交的數(shù)據(jù),并調(diào)用相應(yīng)模型來(lái)處理它們,最后決定視圖中的展現(xiàn)內(nèi)容和方式.
用戶(hù)管理控制器accountController處理登錄頁(yè)面的Action方法的代碼如下:
public ActionResult Login()
{
return View();
}
[HttpPost]//單擊登錄按鈕后,調(diào)用該方法
public ActionResult Login(User user)
{
var item = db.Users.FirstOrDefault(u => u.UserName == user.UserName && u.PassWord == user.PassWord);
if(item!=null)
{
Session["user"]= item;
return RedirectToAction("Index","Home");
}
ModelState.AddModelError("","login error");
return View(user);
}
MVC框架模式具有耦合性低、重用性高、部署快、可維護(hù)性高和有利軟件工程化管理等諸多優(yōu)點(diǎn).ASP.NET MVC使用Razor 引擎視圖,Razor Pages 可以使基于頁(yè)面的編碼方式更簡(jiǎn)單高效.MVC 模式在ASP.NET中為系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)提供了一種很好的解決方案,實(shí)現(xiàn)了軟件開(kāi)發(fā)的分工和應(yīng)用程序的模塊化,提高了代碼復(fù)用率,降低了維護(hù)成本.此外,所開(kāi)發(fā)的實(shí)例在高等學(xué)校對(duì)教師課堂教學(xué)效果評(píng)測(cè)也有一定的參考和應(yīng)用價(jià)值.