概念MVC是一种架构设计模式,主要应用于图形用户界面(GUI)应用。那么什么是MVC呢?MVC由三部分组成:模型、视图和控制器。模型是应用程序的数据模型。任何应用程序都离不开数据,数据可以存储在数据库、磁盘文件甚至内存中。模型是这些数据的抽象。无论数据采用何种存储形式,应用程序始终可以通过Model对数据进行操作,不需要关心数据的存储形式。数据实体类是一种常用的模型。例如,客户管理应用程序使用数据库来存储客户数据。数据库表中有一个客户表,通常在对应的程序中建立一个数据实体类客户与之对应。这个实体类甚至是客户表的模型。是应用程序的接口。用户通过View操作应用程序,完成与程序的交互。视图提供可视化界面来显示模型中定义的数据,用户通过视图操作数据,并将操作模型数据的结果返回给用户。在桌面应用程序中,视图可以是一个或多个窗口窗体。在Web应用程序中,视图由一系列网页组成,这是一个。ASP.NET网站上的aspx页面。控制器定义程序的应用逻辑。用户通过View向控制器发送操作命令,控制器根据编程逻辑更新模型定义的数据,并通过View将操作结果返回给用户。
历史MVC的概念最早是由美国教授Trygve Reenskaug在1979年提出的。1988年,MVC在《A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk -80》年正式提出。随着微软Windows操作系统的快速发展和普及,图形用户界面应用逐渐成为主流,在很多编程语言中都出现了MVC框架,方便开发者使用这种模型设计应用。这些框架大部分是针对Web应用程序的。MVC设计模式在。网络开发ASP.NET 1。x采用CodeBehind技术,彻底结束了传统ASP程序开发的噩梦:程序逻辑和HTML界面元素混合在一起。代码隐藏技术将。控件中表示程序接口(视图)的. aspx文件。vb/。cs文件的逻辑(控制器)代码,这是一个MVC设计。码旁技术再次出现在ASP.NET 2.0,也就是an。aspx文件可以有多个。vb/。cs文件,这便于接口和逻辑代码的进一步分离。2008年3月,微软发布了ASP.NET 3.5的MVC框架(预览版2)。这是ASP.NET真正的MVC框架。该框架可以说是对以前开发者熟悉的基于Web Form的应用开发模式的“颠覆”。这些变化可以用“令人震惊”来形容:1。使用网址路由技术:网络程序的网址不再指向特定的物理页面。而是一个控制器的特定方法。典型的基于MVC的程序的URL可能如下:在http://www.mysite.com/Customer/Index使用基于MVC的程序的程序的URL不需要有文件扩展名。上面网址中的客户是控制器的名称。索引是由客户定义的方法名。2.网络程序界面。aspx不再使用服务器端表单: ASP : form runat=' server '/表单,因此与服务器端表单相关的回发和页面生命周期事件不存在。3.页面中没有视图状态。在MVC下,视图状态不能用来存储程序状态信息。4.不再提供依赖于服务器端表单的服务器控件事件,在MVC下不再需要开发人员熟悉的Button_Clicked事件。安装ASP.NET MVC预览版2后,将在VS2008中添加一个新的项目模板‘ASP.NET MVC Web Application’,如下图所示。
新建项目后,由VS2008自动生成的项目文件结构如下。MVC的三个组件都有一个文件夹来存储自己的程序文件。
前面提到的网址路由即在Global.asax.cs中设置:复制代码代码如下:公共类全局应用程序:系统.网络。HttpApplication { public static void register routes(路由集合路由){//注意: IIS7以下的(同移民检查员移民检查)版本需将统一资源定位器格式设置为{控制器}。启用路由的mvc/{action}/{id} .添加(新路由(' {控制器})。mvc/{action}/{id} ',new mvcrouthandler()){ Defaults=new routeevalueddictionary(new { action=' Index ',id='' }),});//设置网址路由格式路线。添加(新路由(' Default.aspx ',新的mvcrouthandler()){默认值=新路由评估预测(新的{控制器='客户',操作='Index ',id='' }),});//设置默认统一资源定位器指向客户控制员的索引方法}受保护的作废申请_开始(对象发送者,事件参数{注册路线(路线表).路线);}}【代码【1】:Global.asax.cs下面来实现顾客的模型、控制器及视图:模型:在项目中的模型文件夹下,新建一个'链接到结构化查询语言类,将北风数据库中的顾客表拖拽到其设计视图中。这样就完成了顾客对应的型号。如图4
控制器:在项目中的控制器文件夹下,新建一个手动音量调节控制器类,命名为CustomerContoller.cs。在此类中添加一个公有方法索引,此方法及为在Global.asax.cs中设置好的默认统一资源定位器所映射的方法。复制代码代码如下:公共类客户控制器:控制器{公共空索引(字符串北风号.模特。DC=新北风.模特。north WindDataContext();IListNorthwind .模型。客户客户=dc .顾客。拿(10)来说to list();//取数据库中的10个顾客记录RenderView('索引,客户);//返回索引视图}}【代码【2】:客户控制器。cs视图:上面索引方法的代码表示客户联系人的索引方法执行后,需要返回一个名称为索引的查看,以便将数据呈现给用户。下面来添加这个索引视图:在项目的视角文件中,新建一个子文件夹顾客。与客户控制员有关的视角将保存在此文件夹下。新建一个手动音量调节视图类'并命名为Index.aspx。在前面的呈现视图("索引",客户)方法中,客户参数是控制器传递给视角所需的数据,该参数的类型为IListNorthwind .模型。客户。为了在视角中方便使用此强类型的数据,View.aspx.cs使用了如下代码:注意粗体部分复制代码代码如下:公共分部类索引: ViewPageIListNorthwind .模型。客户{}【代码【3】:Index.aspx.cs View.aspx代码如下:视图数据这一成员变量的类型及为上面提到的IListNorthwind .模型。客户类型。复制代码代码如下: %@页面语言='C#' AutoEventWireup='true '代码隐藏='编辑。aspx。cs“Inherits=”北风.视图。客户。编辑"%!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www .w3。L1-过渡时期。DTD ' html xmlns=' http://www .w3。org/1999/XHTML ' head runat=' server ' Title/Title/head dy div table trtdEdit/TD tdCustomer ID/TD tdCompany Name/TD tdContact Name/TD tdContact Title/TD/TR % foreach模型。视图数据中的客户客户){ % tr TDA href='客户。MVC/编辑/%=客户客户标识% '编辑/a/td!—网址指向客户控制员的编辑方法- td/td td %=客户CustomerID %/td td %=客户.CompanyName %/td td %=客户ContactName %/td td%=客户联系标题%/TD/tr % } %/表格/div/正文/html【代码【4】:Index.aspx下面来实现客户控制员的编辑方法。
在CustomerController.cs中添加如下代码:复制代码代码如下:公共无效编辑(字符串北风号.模特。DC=新北风.模特。north WindDataContext();客户c=直流.顾客。单身CustomerID==id);//从数据库中取出参数编号所对应的的一个顾客记录RenderView('Edit ',c);//返回编辑视图【代码【5】:客户控制器中的编辑方法相应的在项目中的视图/客户/文件夹下,添加编辑视图编辑。aspx:复制代码代码如下:公共分部类编辑:视图页面北风。模型。客户{}【代码【6】:Edit.aspx.cs复制代码代码如下:%@页面语言='C#' AutoEventWireup='true '代码隐藏='编辑。aspx。cs“Inherits=”北风.视图。客户。编辑"%!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www .w3。org/TR/XHTML 1/DTD/XHTML 1-Transitional。DTD ' html xmlns=' http://www .w3。org/1999/XHTML ' head runat=' server ' title/title/head dy!—下面的超文本标记语言表单将用户的输入提交到客户控制员的更新方法-%使用(Html .形成北风。控制器。客户控制器(cc=cc .更新(视图数据){ % div客户id :%=查看数据.CustomerID % br/Company Nmae :%=Html .文本框('客户。公司名称,视图数据公司名称)% br /联系人姓名: %=Html .文本框('客户。联系人姓名,视图数据联系人姓名)% br/联系人标题:%=Html .文本框('客户。联系人标题,视图数据ContactTitle) % /div %=Html .提交按钮('保存')% % } %/正文/html[代码【7】:Edit.aspx代码七中使用了手动音量调节框架中的一个帮助类Html。此类可以生产视角中常用的界面元素,例如超文本标记语言表单,文本输入框等。下面来实现客户控制器的更新方法:复制代码代码如下:公共作废更新(字符串北风号.模特。北winddata context DC=新北wind data context();//从数据库中取出参数编号所对应的的一个顾客记录:客户客户=dc .客户。单(c=c . CustomerID==id);//将编辑视图中的用户的更改赋值到卡斯特对象: BindingHelperExtensions .更新自(客户,请求。形式);华盛顿提交更改();RedirectToAction(' Index ');//跳转到索引视图}【代码【8】:客户控制器中的更新方法上面的代码通过ASP。网最有价值球员框架实现了顾客的列表、编辑及更新功能,可以看出手动音量调节将应用程序的模型、视图及控制器三部分'优雅的'分离,真正实现了高内聚、低耦合的灵活架构,大大降低了程序的复杂性,提高了可扩展性及可重用性。这一框架对网开发带来的影响不仅是是技术上的变化,更是网程序设计思想的变化-网络程序不再是一些列功能页面的集合,而是又控制器控制的功能单元的集合,网页程序更像是一组通过其统一资源定位器对外开放的美国石油学会。