MVC设计模式的实现技巧
MVC设计模式的实现技巧 有那些呢?
MVC由Trygve Reenskaug提出,首先被应用在SmallTalk-80环境中,是许多交互和界面系统的构成基础。MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离。MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定系统各部分间的组织关系。对于界面设计可变性的需求,MVC(Model-View-Controller)把交互系统的组成分解成模型、视图、控制器三种部件。
MVC由Trygve Reenskaug提出,首先被应用在SmallTalk-80环境中,是许多交互和界面系统的构成基础。MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离。MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定系统各部分间的组织关系。对于界面设计可变性的需求,MVC(Model-View-Controller)把交互系统的组成分解成模型、视图、控制器三种部件。
MVC 设计模式
从工程结构上讲, 创建一个ASP.net MVC 项目,控制器和视图各自在Controller和view文件夹下。工程结构清晰、一目了然。
模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能,如图1所示。
视图
视图是模型的表示,它提供用户交互界面。使用多个包含单显示页面的用户部件,复杂的Web页面可以展示来自多个数据源的内容,并且网页人员,美工能独自参与这些Web页面的开发和维护。 这都归功于强大的HtmlHelper类。
MVC没有沿用Asp.net的自带控件,而是完全利用HtmlHelper类封装了Html常用组件。
HtmlHelper中的控件,很容易用户的扩展。下面举几个例子
给Password 加上样式
<%=Html.Password("myPassword", 50,"",new { style = "width:100px" })%><br />
按钮绑定到自定义Javascript响应 函数
<%=Html.Button("cmdJS","Click Me","DoTheClickThang()")%>
使用图片button
<%=Html.Button("cmdJS","~/Images/Clicky.png","DoTheClickThang()")%>
控制器 Controller
为了能够控制和协调每个用户跨越多个请求的处理,控制机制应该以集中的方式进行管理。因此,为了达到集中管理的目的引入了控制器。应用程序的控制器集中从客户端接收请求(典型情况下是一个运行浏览器的用户),决定执行什么商业逻辑功能,然后将产生下一步用户界面的责任委派给一个适当的视图组件。
控制器中返回视图的方法主要有以下几种
a) View – 返回一个ViewResult结果。
b) Redirect – 返回一个RedirectResult 动作结果。
c) RedirectToAction – 返回一个RedirectToAction动作结果。
d) RedirectToRoute – 返回一个RedirectToRoute动作结果。
e) Json – 返回一个JsonResult动作结果。
f) Content – 返回一个ContentResult动作结果。
比如,如果你想向浏览器返回一个视图,你可以调用View()方法。如果你想要从一个控制器动作重定向到另一个,你可以调用RedirectToAction()方法
模型
MVC系统中的模型从概念上可以分为两类――系统的内部状态和改变系统状态的动作。模型是你所有的商业逻辑代码片段所在。本文为模型提供了业务实体对象和业务处理对象:所有的业务处理对象都是从ProcessBase类派生的子类
视图绑定到模型
模型可以是数据库生成的实体,扩展实体,继承等派生出的实体类,也可以是自己定义的数据类。创建视图的时候,可以选择工程中存在的实体,从而页面自动绑定到实体。
下面定义了一个结构
public class Product
{
public int ID { get; set; }
public string Description { get; set; }
public Category myCatetory { get; set; }
}
public class Category
{
public int ID { get; set; }
public string Title { get; set; }
}
如何绑定到该实体上呢,可以new一个新的实体,然后再绑定。
public ActionResult Create(Product product)
{
Return View();
}
Product vProduct = new Product();
// 初始化vProduct 的内部属性
Return View(“Create”, vProduct);
从上面的例子,可以看出MVC 可以绑定一个很复杂的模型,因此可以通过JQuery、AJAX等手段通过异步方式更新局部的MVC 页面。
MVC设计模式的扩展
通过在ASP.NET中的MVC模式编写的,具有极其良好的可扩展性。它可以轻松实现以下功能:
①实现一个模型的多个视图;
②采用多个控制器;
③当模型改变时,所有视图将自动刷新;
④所有的控制器将相互独立工作。
这就是MVC模式的好处,只需在以前的程序上稍作修改或增加新的类,即可轻松增加许多程序功能。以前开发的许多类可以重用,而程序结构根本不再需要改变,各类之间相互独立,便于团体开发,提高开发效率。下面讨论如何实现一个模型、两个视图和一个控制器的程序。其中模型类及视图类根本不需要改变,与前面的完全一样,这就是面向对象编程的好处。对于控制器中的类,只需要增加另一个视图,并与模型发生关联即可。该模式下视图、控制器、模型三者之间的示意图下图所示。
MVC的优点体现在以下几个方面:
(1) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。
(2) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。
(3) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。
(4) 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
MVC的不足:
(1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
(2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
(3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
(4) 目前,一般高级的界面工具或构造器不支持MVC模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。
欢迎您到我在百洋软件实验室的正式博客里留言讨论
本文MVC设计模式的实现技巧转载自百洋软件实验室