MVC概念
MVC是一種架構設計模式該模式主要應用於圖形化用戶界面(GUI)應用程序那麼什麼是MVC?MVC由三部分組成Model(模型)View(視圖)及Controller(控制器)
Model即應用程序的數據模型任何應用程序都離不開數據數據可以存儲在數據庫中磁盤文件中甚至內存中Model就是對這些數據的抽象不論數據采取何種存儲形式應用程序總是能夠通過Model來對數據進行操作而不必關心數據的存儲形式數據實體類就是常用的一種Model例如一個客戶管理應用程序使用數據庫來存儲客戶數據數據庫表中有一個客戶表Customer相應的程序中一般會建立一個數據實體類Customer來與之對應這個實體類即使客戶表的Model
View是應用程序的界面用戶通過View來操作應用程序完成與程序的交互View提供了可視化的界面來顯示Model中定義的數據用戶通過View來操作數據並將對Model數據操作的結果返回給用戶在桌面應用程序中View可能是一個或多個Windows窗體在Web應用程序中View是由一系列網頁構成在ASPNET網站中即為aspx頁面
Controller 定義了程序的應用邏輯用戶通過View發送操作命令給Controller由Controller按照程序設計的邏輯來更新Model定義的數據並將操作結果通過View返回給用戶
MVC的歷史
MVC這一概念最早由美國教授Trygve Reenskaug於年提出年MVC這一設計模式正式在《A Cookbook for Using the ModelViewController User Interface Paradigm in Smalltalk 》一書中提出伴隨著微軟Windows操作系統的迅速發展與普及圖形化用戶界面應用程序逐漸成為主流很多編程語言都出現了MVC框架以方便開發人員使用該模式來設計應用程序這些框架中大部分都是針對Web應用程序
NET Web開發中MVC設計模式的實現
ASPNET x中使用了CodeBehind技術徹底終結了傳統ASP程序開發的夢魇程序邏輯與HTML界面元素混雜在一起CodeBehind技術將代表程序界面(View)的aspx文件與邏輯(Controller)代碼vb/cs文件的分離即是一種MVC式的設計ASPNET 中又出現了CodeBeside技術即一個aspx文件可以有多個vb/cs文件這又方便了界面與邏輯代碼的進一步分離
年月微軟發布了針對ASPNET 的MVC框架 (Preview 版本)這是一個真正意義上的ASPNET MVC框架該框架可以說是對之前為開發人員所熟悉的基於Web Form的應用程序開發方式的顛覆變化可謂震撼
使用URL Routing技術Web程序的URL不再是指向具體的物理頁面aspx而是指向某個Controller的某個方法一個典型的MVC架構的程序其URL可能如下所示
使用該MVC架構的程序其URL不必有文件擴展名上面這個URL中的Customer即為Controller的名字而Index是Customer定義的一個方法名
Web程序的界面aspx不再使用服務器端的Form:
<asp: form runat=server></form>
那麼與服務器端的Form相關的Postback以及頁面生命周期的事件也不存在了
頁面中不再有View StateMVC下將不能使用View State來存儲程序狀態信息
不再提供依賴於服務器端Form的服務器控件事件開發人員熟悉的Button_Clicked事件在MVC下將不再需要
NET MVC示例
安裝完 ASPNET MVC Preview 後VS中會添加一個新的項目模板ASPNET MVC Web Application 如下圖所示
新建該項目後 VS自動生成項目的文件結構如下 MVC三個組成部分各有一個文件夾來存儲各自的程序文件
前面提到的URL Routing即在Globalasaxcs中設置
public class GlobalApplication : SystemWebHttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
// 注意: IIS以下的IIS版本需將URL格式設置為 {controller}mvc/{action}/{id} to enable
routesAdd(new Route({controller}mvc/{action}/{id} new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { action = Index id = })
});//設置URL Routing格式
routesAdd(new Route(Defaultaspx new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = Customer action = Index id = })
});//設置默認URL指向Customer Controller的Index方法
}
protected void Application_Start(object sender EventArgs e)
{
RegisterRoutes(RouteTableRoutes);
}
}
【代碼
】
Global
asax
cs
下面來實現Customer 的ModelController及View:
Model: 在項目中的Model文件夾下新建一個Linq to SQL Classes將Northwind數據庫中的Customer表拖拽到其設計視圖中這樣就完成了Customer對應的Model如圖
Controller: 在項目中的Controller文件夾下新建一個MVC Controller Class命名為CustomerContollercs 在此類中添加一個公有方法Index此方法及為在Globalasaxcs中設置好的默認URL所映射的方法
public class CustomerController : Controller
{
public void Index(string id)
{
NorthwindModelsNorthwindDataContext dc = new NorthwindModelsNorthwindDataContext();
IList<NorthwindModelsCustomer> customers = dcCustomersTake()ToList();//取數據庫中的個Customer記錄
RenderView(Index customers);//返回Index View
}
}
【代碼
】
CustomerController
cs
View: 上面Index方法的代碼表示CustomerContoller的Index方法執行後需要返回一個名稱為Index的View以便將數據呈現給用戶下面來添加這個Index View在項目的View文件中新建一個子文件夾Customer與Customer Controller有關的View將保存在此文件夾下新建一個MVC View Class並命名為Indexaspx在前面的RenderView(Index customers)方法中customers參數是Controller傳遞給View所需的數據該參數的類型為IList<NorthwindModelsCustomer>為了在View中方便使用此強類型的數據Viewaspxcs使用了如下代碼注意粗體部分
public partial class Index : ViewPage<IList<NorthwindModelsCustomer>>
{
}
【代碼
】
Index
aspx
cs
Viewaspx代碼如下ViewData這一成員變量的類型及為上面提到的IList<NorthwindModelsCustomer>類型
<%@ Page Language=C# AutoEventWireup=true CodeBehind=Editaspxcs Inherits=NorthwindViewsCustomerEdit %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd>
<html xmlns= >
<head runat=server>
<title></title>
</head>
<body>
<div>
<table>
<tr>
<td>Edit</td>
<td>Customer ID </td>
<td>Company Name </td>
<td>Contact Name </td>
<td>Contact Title </td>
</tr>
<% foreach (NorthwindModelsCustomer customer in ViewData)
{%>
<tr>
<td><a Customermvc/Edit/<%= customerCustomerID %>>Edit</a></td><!—URL指向Customer Contoller的Edit方法 >
<td></td>
<td> <%= customerCustomerID %></td>
<td> <%= customerCompanyName %></td>
<td> <%= customerContactName %></td>
<td><%= customerContactTitle %></td>
</tr>
<%} %>
</table>
</div>
</body>
</html>
【代碼】Indexaspx
下面來實現Customer Controller的Edit方法在CustomerControllercs中添加如下代碼
public void Edit(string id)
{
NorthwindModelsNorthwindDataContext dc = new NorthwindModelsNorthwindDataContext();
Customer c = dcCustomersSingle(cus => cusCustomerID == id);//從數據庫中取出參數id所對應的的一個Customer記錄
RenderView(Edit c);//返回Edit View
【代碼
】
CustomerController
cs中的Edit方法
相應的在項目中的View/Customer/文件夾下添加Edit View Editaspx:
public partial class Edit : ViewPage<NorthwindModelsCustomer>
{
}
【代碼
】
Edit
aspx
cs
<%@ Page Language=C# AutoEventWireup=true CodeBehind=Editaspxcs Inherits=NorthwindViewsCustomerEdit %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd>
<html xmlns= >
<head runat=server>
<title></title>
</head>
<body>
<!—下面的 html form 將用戶的輸入提交到Customer Contoller的Update方法 >
<%using( HtmlForm<NorthwindControllersCustomerController>(cc=>ccUpdate(ViewDataCustomerID))){ %>
<div>
Customer ID: <%= ViewDataCustomerID %> <br />
Company Nmae: <%= HtmlTextBox(CustomerCompanyName ViewDataCompanyName) %> <br />
Contact Name: <%= HtmlTextBox(CustomerContactNameViewDataContactName) %><br />
Contact Title: <%= HtmlTextBox(CustomerContactTitleViewDataContactTitle) %>
</div>
<%= HtmlSubmitButton(Save) %>
<%} %>
</body>
</html>
【代碼
】
Edit
aspx
代碼中使用了MVC框架中的一個幫助類Html此類可以生產View中常用的界面元素例如 html form文本輸入框等
下面來實現CustomerController的Update方法
public void Update(string id)
{
NorthwindModelsNorthwindDataContext dc = new NorthwindDataContext();
//從數據庫中取出參數id所對應的的一個Customer記錄
Customer cust = dcCustomersSingle(c => cCustomerID == id);
//將Edit View中的用戶的更改賦值到cust對象:
BindingHelperExtensionsUpdateFrom(cust RequestForm);
dcSubmitChanges();
RedirectToAction(Index);//跳轉到Index View
}
【代碼】CustomerControllercs中的Update方法
上面的代碼通過ASPNET MVC框架實現了Customer的列表編輯及更新功能可以看出MVC將應用程序的ModelView及Controller三部分優雅的分離真正實現了高內聚低耦合的靈活架構大大降低了程序的復雜性提高了可擴展性及可重用性這一框架對Web開發帶來的影響不僅是是技術上的變化更是Web程序設計思想的變化 Web程序不再是一些列功能頁面的集合而是又Controller控制的功能單元的集合Web程序更像是一組通過其URL對外開放的API
From:http://tw.wingwit.com/Article/program/ASP/201311/21759.html