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);
}
}
【代码】Globalasaxcs
下面来实现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
}
}
【代码】CustomerControllercs
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>>
{
}
【代码】Indexaspxcs
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
【代码】CustomerControllercs中的Edit方法
相应的在项目中的View/Customer/文件夹下添加Edit View Editaspx:
public partial class Edit : ViewPage<NorthwindModelsCustomer>
{
}
【代码】Editaspxcs
<%@ 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>
【代码】Editaspx
代码中使用了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