在ASP.NET中實(shí)現(xiàn)MVC模式(二)
2024-07-10 12:57:25
供稿:網(wǎng)友
 
在asp.net中實(shí)現(xiàn)model-view-controller模式(二)
 
mvc模式形容這種實(shí)現(xiàn)方式是一種被動(dòng)的實(shí)現(xiàn)機(jī)制,asp.net充當(dāng)了程序執(zhí)行中的控制器的角色,但程序員必須將具體的事件處理方法添加到事件的響應(yīng)函數(shù)中。如在這個(gè)例子中,控制器在頁(yè)面加載之前調(diào)用page_load函數(shù)并執(zhí)行其中的代碼,當(dāng)用戶(hù)點(diǎn)擊submit按鈕時(shí)由系統(tǒng)調(diào)用submitbtn_click函數(shù)并執(zhí)行。
 
這種將代碼都包含在一個(gè)文件中的實(shí)現(xiàn)方式非常的直接,而且當(dāng)應(yīng)用程序很小并不經(jīng)常修改的時(shí)候也可以說(shuō)是一種好的方法,但是如果下面的一些情況出現(xiàn)的話(huà)你也許會(huì)開(kāi)始考慮修改這種實(shí)現(xiàn)方法:
 
使編程的工作并行并減少由此帶來(lái)的發(fā)生錯(cuò)誤的可能性。為了增加工作的并行性,提高效率,你可能想讓不同的人編寫(xiě)視圖的代碼及模型代碼并盡力減少這種工作方式所帶來(lái)的出錯(cuò)的可能性。例如:當(dāng)所有的代碼都在一個(gè)文件中的話(huà),那么一個(gè)編程人員可能會(huì)在改變datagrid顯示格式的時(shí)候無(wú)意中修改數(shù)據(jù)訪(fǎng)問(wèn)的代碼。這種錯(cuò)誤是很難被發(fā)現(xiàn)的,直到頁(yè)面整體被編譯的時(shí)候才會(huì)顯現(xiàn)出來(lái)。。
 
使你的數(shù)據(jù)訪(fǎng)問(wèn)代碼在其它頁(yè)面中重用。在這種單文件的實(shí)現(xiàn)方式中,除了拷貝代碼,沒(méi)有其它的方法能夠做到代碼的重用。拷貝的代碼是很難被維護(hù)的,因?yàn)橐坏┐a發(fā)生了變化,你必須在所有的頁(yè)面都進(jìn)行修改。
 
為了避免上面這些情況的發(fā)生,asp.net引入了代碼分離(code-behind)機(jī)制。
 
用代碼分離機(jī)制進(jìn)行重構(gòu)
microsoft visual studio .net中的代碼分離機(jī)制使視圖層的代碼與模型及控制器的代碼能夠很容易的分離。每個(gè)asp.net頁(yè)面都有一種機(jī)制,能夠使其要調(diào)用的方法在一個(gè)與其分離的類(lèi)中實(shí)現(xiàn)。這種方式使用起來(lái)非常的方便,而且也可以利用visual studio .net中的一些其它特性共同完成開(kāi)發(fā)工作。比如如當(dāng)你利用代碼分離的機(jī)制開(kāi)發(fā)你的頁(yè)面的時(shí)候,可以利用智能感知(intellisense technology)顯示出一個(gè)可用方法的列表方便編程。而智能感知技術(shù)在.aspx頁(yè)面中是不能使用的。
 
下面給出的是上面例子利用代碼分離機(jī)制的實(shí)現(xiàn)。
 
視圖部分:
 
視圖層的代碼現(xiàn)在一個(gè)單獨(dú)的文件中實(shí)現(xiàn)。solution.aspx:
 
<%@ page language="c#" codebehind="solution.aspx.cs" 
 autoeventwireup="false" inherits="solution" %>
<html>
 <head>
 <title>solution</title>
 </head>
 <body>
 <form id="solution" method="post" runat="server">
 <h3>recordings</h3>
 select a recording:<br/>
 <asp:dropdownlist id="recordingselect" runat="server" />
 <asp:button id="submit" runat="server" text="submit" 
 enableviewstate="false" />
 <p/>
 <asp:datagrid id="mydatagrid" runat="server" width="700"
 backcolor="#ccccff" bordercolor="black" showfooter="false"
 cellpadding="3" cellspacing="0" font-name="verdana" font-size="8pt"
 headerstyle-backcolor="#aaaadd" enableviewstate="false" />
 </form>
 </body>
</html>
大部分代碼都與前面的解決方案的代碼相同。主要的不同點(diǎn)是第一行:
<%@ page language="c#" codebehind="solution.aspx.cs" 
 autoeventwireup="false" inherits="solution" %>
 
這行告訴asp.net執(zhí)行環(huán)境,這個(gè)頁(yè)面的具體實(shí)現(xiàn)機(jī)制在一個(gè)單獨(dú)的類(lèi)中。因?yàn)檫@個(gè)頁(yè)面是獨(dú)立的,因此如果數(shù)據(jù)訪(fǎng)問(wèn)的代碼發(fā)生變化,這個(gè)頁(yè)面并不需要做任何改動(dòng)。同樣,一些設(shè)計(jì)師也可以改變這個(gè)頁(yè)面的代碼而不會(huì)引起任何數(shù)據(jù)訪(fǎng)問(wèn)的錯(cuò)誤。