黃玉春
(安徽工業(yè)職業(yè)技術(shù)學(xué)院 信息工程系,安徽 銅陵 244000)
近年來,越來越多的ASP.NET開發(fā)人員開始接觸MVC框架,開始大都認(rèn)為MVC與ASP.NET完全沒有關(guān)系,是一個全新的Web開發(fā),而事實上MVC是一種更高級架構(gòu)體系.原來的ASP.NET稱為 ASP.NET WebForms,新的MVC 稱為ASP.NET MVC.
ASP.NET是微軟推出的基于 .NET Framework的Web開發(fā)平臺,目前最新的版本是ASP.NET Core(也被稱為 ASP.NET 5),是一個開源跨平臺的開發(fā)框架,用于構(gòu)建基于云的現(xiàn)代 Web 應(yīng)用 .它是從底層開始重新構(gòu)建來提供性能優(yōu)良的Web應(yīng)用開發(fā)框架,可以部署在云上或者本地服務(wù)器上.ASP.NET Core實現(xiàn)了真正的跨平臺,用戶可以很容易的在Windows,Mac或者Linux上開發(fā)和部署Web應(yīng)用,可以在云上部署和調(diào)試Web應(yīng)用.
但在開發(fā)B/S結(jié)構(gòu)的Web應(yīng)用過程中,有一些開發(fā)人員往往采用Web Forms開發(fā)模式,該模式是一種事件驅(qū)動模型,將業(yè)務(wù)邏輯和頁面顯示混合在一起,該模式不利于分工與協(xié)作,而且在業(yè)務(wù)邏輯中采用內(nèi)嵌SQL語句的方式完成數(shù)據(jù)訪問,一旦數(shù)據(jù)庫或者類定義中一方發(fā)生變化,就會導(dǎo)致Web應(yīng)用系統(tǒng)的大量修改,不利于系統(tǒng)的維護(hù).
針對上述不足,對ASP.NET Core框架中的MVC開發(fā)框架進(jìn)行探索,并通過一個實例來說明ASP.NET MVC的應(yīng)用.
Web Forms 是傳統(tǒng)的基于事件驅(qū)動的 ASP.NET 模式.它整合了 HTML、服務(wù)器控件、服務(wù)器事件和服務(wù)器代碼的網(wǎng)頁.在Visual Studio開發(fā)環(huán)境中,開發(fā)人員通過拖拽UI元素生成前臺頁面,在后臺編寫操作這些UI元素的邏輯代碼的方式開發(fā)Web Forms應(yīng)用程序.
Web Forms 請求流程如圖1所示.
ASP.NET Web Forms的HTTP請求處理過程是比較復(fù)雜的,但一般可以理解為經(jīng)過以下幾個步驟:
(1)瀏覽器發(fā)送http請求.
(2)轉(zhuǎn)交請求(把請求交給.NET FrameWork進(jìn)行處理.)
(3)創(chuàng)建頁面類對象,返回給瀏覽器.
(4)瀏覽器解析html代碼,生成網(wǎng)頁.
(1)有大量服務(wù)器控件支持,除了有用于設(shè)計界面和輸入驗證的Web控件外,還有GridView、DataList、Repeater等控件可以方便地進(jìn)行數(shù)據(jù)綁定,從而減少了大量代碼的編寫.
(2)采用事件驅(qū)動模式來控制應(yīng)用程序請求,如:Click事件等,aspx和cs文件分離,即顯示邏輯和處理邏輯分離.
(3)支持視圖狀態(tài),即通過ViewStates自動保存Post返回的狀態(tài),每個控件以“隱藏域”的形式存在當(dāng)前表單頁面未達(dá)到“有狀態(tài)”.
(1)由于使用的ViewState會增加頁面的大小(一般會增加兩倍字節(jié)),造成性能不高,消耗大量帶寬.
(2)Web Forms加載時間明顯比MVC加載時間要長,大約是MVC加載時間的兩倍.
(3) 因為采用code-behind 代碼后置技術(shù),每個aspx文件都包含.aspx和.aspx.cs兩個文件,緊密耦合度太高.
(4)因為緊密耦合度太高、使用大量的事件處理函數(shù),不利于單元測試.
后臺代碼和服務(wù)器控件是ASP.NET Web Forms一切問題的根源.MVC是一種使用Model View Controller(模型-視圖-控制器)設(shè)計創(chuàng)建Web應(yīng)用程序模式,微軟公司于2009年正式發(fā)布ASP.NET MVC.Controller中包含后臺代碼邏輯,View是ASPX,如純HTML代碼,Model是中間層.這三部分的關(guān)系如圖2所示.

圖1 WebForms頁面的運行示意圖

圖2 ASP.NET Web Forms三層體系結(jié)構(gòu)與MVC對應(yīng)關(guān)系
通過研究可以發(fā)現(xiàn)MVC的改變有兩點.一是View變成簡單的HTML代碼,二是后臺代碼移到簡單的.NET類中,稱為控制器.
ASP.NET MVC 請求流的通用步驟是:首先獲取控制器.其次依賴行為(Action)控制器創(chuàng)建Model對象,Model通過轉(zhuǎn)換調(diào)用數(shù)據(jù)訪問層.最后數(shù)據(jù)填充Model之后,傳遞到View 顯示層,實現(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)用程序中處理用戶交互的部分,通常控制器從視圖讀取數(shù)據(jù)、控制用戶輸入,并向模型發(fā)送數(shù)據(jù).MVC大致流程如圖3所示.
模型(Model)是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分,是MVC設(shè)計的核心,它封裝了系統(tǒng)的核心流程和業(yè)務(wù)規(guī)則,通常模型對象在數(shù)據(jù)庫中存取數(shù)據(jù)和數(shù)據(jù)業(yè)務(wù)處理.
視圖(View)是Web應(yīng)用程序中處理數(shù)據(jù)顯示的部分,主要負(fù)責(zé)向用戶顯示相關(guān)數(shù)據(jù),并接受用戶的輸入數(shù)據(jù),但它并不實際處理這些數(shù)據(jù).通常從模型數(shù)據(jù)中創(chuàng)建視圖.一個視圖可以被多個控制器重用.
控制器(Controller)是應(yīng)用程序中處理用戶交互的部分,負(fù)責(zé)模型和視圖之間的同步,接受用戶從視圖輸入的數(shù)據(jù)并調(diào)用模型處理數(shù)據(jù),最后將處理結(jié)果返回到視圖.通常一個視圖具有一個控制器.
對于瀏覽器端的一個http請求,請求的是控制器的某一個Action方法,一般格式為:
http://localhost:8080/控制器名/方法名
控制器的Action方法接收后,服務(wù)器端存在一些判斷邏輯來處理這些請求,控制器用相應(yīng)的視圖呈現(xiàn)給用戶.
對于瀏覽器端用戶通過一組輸入控件和提交按鈕組成的HTML請求,首先也是被控制器接收,通過對應(yīng)的Action方法決定相應(yīng)的模型處理請求并返回數(shù)據(jù),最后控制器用相應(yīng)的視圖去格式化模型返回的數(shù)據(jù),并通過顯示頁面呈現(xiàn)給用戶.
模型、視圖與控制器的分離,使得一個模型可以具有多個顯示視圖.如果用戶通過某個視圖的控制器改變了模型的數(shù)據(jù),所有其它依賴于這些數(shù)據(jù)的視圖都應(yīng)反映到這些變化.因此,無論何時發(fā)生了何種數(shù)據(jù)變化,控制器都會將變化通知所有的視圖,導(dǎo)致顯示的更新.這實際上是一種模型的變化-傳播機(jī)制.
MVC模式的出現(xiàn)不僅實現(xiàn)了功能模塊和顯示模塊的分離,同時它還提高了應(yīng)用系統(tǒng)的可維護(hù)性、可擴(kuò)展性、可移植性和組件的可重用性.MVC 的優(yōu)勢具體有以下幾點:
(1)耦合性低.視圖層和業(yè)務(wù)層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼.同樣,一個應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需要改動MVC的模型層即可.因為模型與控制器和視圖相分離,所以很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則.
(2)重用性高.隨著互聯(lián)網(wǎng)技術(shù)的不斷進(jìn)步,應(yīng)用程序的訪問方式也越來越多.MVC模式允許多個視圖共享一個模型,因此允許使用各種不同樣式的視圖來訪問同一個服務(wù)器端的代碼,用戶可以通過電腦也可通過移動設(shè)備來訪問.MVC使開發(fā)和維護(hù)用戶接口的技術(shù)含量降低.
(3)可維護(hù)性高.視圖層和業(yè)務(wù)邏輯層的分離也使得Web應(yīng)用更易于維護(hù)和修改.例如,業(yè)務(wù)邏輯和修改視圖可以分別修改,相互獨自,互不干擾.分層最大的好處就是容易后期維護(hù)降低維護(hù)成本,和增加新的功能,提高代碼重用性,從而提高開發(fā)效率.
(4)不支持ViewState,這樣的頁面更加簡潔,可以提升程序的性能.
(5)有利軟件工程化管理.由于不同的層各司其職,每一層不同的應(yīng)用具有某些相同的特征,有利于通過工程化、工具化管理程序代碼.
MVC有以下不足之處:
(1)對 MVC 的準(zhǔn)確理解和把握并不是那么容易.運用 MVC 需要精心的計劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費一些時間去思考.
(2)MVC增加了系統(tǒng)結(jié)構(gòu)的難度和實現(xiàn)的復(fù)雜性.對于簡單的界面,如果嚴(yán)格按照 MVC 設(shè)計模式,使模型、視圖與控制器分離,增加了結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的系統(tǒng)交互,降低運行效率.
(3)MVC 理論上要求視圖和控制器的分離,但實際中總會存在一定程度的聯(lián)系.視圖與控制器是相互分離的部件,但確實聯(lián)系緊密,視圖沒有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣也會妨礙了他們的獨立重用.
本例以某高校教師課堂教學(xué)網(wǎng)上評測系統(tǒng)為例.
教師課堂教學(xué)是高等學(xué)校教學(xué)質(zhì)量保證的關(guān)鍵所在,建立科學(xué)、行之有效的課堂教學(xué)質(zhì)量評價體系是改善教學(xué)質(zhì)量的有效途徑.學(xué)院根據(jù)教育部印發(fā)的《高等職業(yè)院校內(nèi)部質(zhì)量保證體系診斷與改進(jìn)指導(dǎo)方案》,制定了學(xué)院教師課堂教學(xué)考核評教指標(biāo),教師課堂考核由學(xué)生通過網(wǎng)絡(luò)對教師課堂紀(jì)律、教學(xué)內(nèi)容、知識講解、語言表達(dá)等10個方面進(jìn)行評測打分.
該系統(tǒng)由學(xué)生測評模塊(前臺系統(tǒng))和管理員管理模塊(后臺系統(tǒng))兩部分組成.
前臺系統(tǒng),是學(xué)生通過手機(jī)登錄到評教頁面(也可以通過電腦登錄評教頁面,對應(yīng)的視圖也不一樣,對應(yīng)的業(yè)務(wù)邏輯是一樣的),對本班任課教師教學(xué)水平、教學(xué)效果進(jìn)行評價,教師可以通過手機(jī)登錄系統(tǒng)查看學(xué)生對自己的教學(xué)評價結(jié)果.后臺系統(tǒng),管理員通過電腦端對課程、任課教師、學(xué)生、班級等信息的維護(hù).各模塊的主要功能如圖4所示.

圖3 MVC模型結(jié)構(gòu)圖

圖4 系統(tǒng)主要功能模塊
該系統(tǒng)使用SQL Server和EF(Entity Framework)創(chuàng)建相關(guān)的數(shù)據(jù)庫及數(shù)據(jù)庫訪問層.EF使用代碼優(yōu)先(Code Ffirst)的方法實現(xiàn)項目,類以及類之間的關(guān)系通過代碼創(chuàng)建,當(dāng)應(yīng)用程序首次執(zhí)行時,EF將在數(shù)據(jù)庫服務(wù)器中自動生成數(shù)據(jù)訪問層以及相應(yīng)的數(shù)據(jù)庫.
(1)創(chuàng)建連接字符串(ConnectionString)
在Web.Config 文件中< Configuration >標(biāo)簽中添加如下代碼:
name="xspjDB" providerName="System.Data.SqlClient"/> (2)添加EF引用.在vs2013中安裝Entity Framework框架. (3)創(chuàng)建項目中所需實體類和DbContext類.(建立了學(xué)生類,其他類略) public class Student { [DisplayName("編號")] public int ID { get;set;} [DisplayName("學(xué)號"),Required] public string sCode { get;set;} [DisplayName("姓名"),Required] public string sName { get;set;} [DisplayName("班級編號"),Required] public string classID { get;set;} [DisplayName("班級")] public virtual Class Class { get;set;} } 創(chuàng)建數(shù)據(jù)訪問層代碼: public class XspjDB:DbContext { public DbSet {get;set;} public DbSet {get;set;} … } 在Views 文件夾中創(chuàng)建與控制器同名的文件夾,在對應(yīng)的文件夾下創(chuàng)建視圖文件,視圖文件有html、aspx、cshtml等.本系統(tǒng)使用razor引擎視圖,擴(kuò)展名為cshtml,Razor 是一種標(biāo)記語法,用于將基于服務(wù)器的代碼嵌入網(wǎng)頁中.視圖頁使用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 視圖層的實現(xiàn)
學(xué)生實習(xí)管理系統(tǒng)
}
在該系統(tǒng)中,控制層的設(shè)計采用分散控制器的原則.頁面控制器捕獲每個視圖頁面中發(fā)生的事件和提交的數(shù)據(jù),并調(diào)用相應(yīng)模型來處理它們,最后決定視圖中的展現(xiàn)內(nèi)容和方式.
用戶管理控制器accountController處理登錄頁面的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)點.ASP.NET MVC使用Razor 引擎視圖,Razor Pages 可以使基于頁面的編碼方式更簡單高效.MVC 模式在ASP.NET中為系統(tǒng)的設(shè)計與實現(xiàn)提供了一種很好的解決方案,實現(xiàn)了軟件開發(fā)的分工和應(yīng)用程序的模塊化,提高了代碼復(fù)用率,降低了維護(hù)成本.此外,所開發(fā)的實例在高等學(xué)校對教師課堂教學(xué)效果評測也有一定的參考和應(yīng)用價值.