ASP.NET WebForm 是微软开发的一款基于视图的编程模型。其目标是为了实现类似 已经应用成熟的 Windows Form 编程体验。Web Form 的好处很明显,可视化的操作体验将"所见即所得"的概念诠释得淋漓尽致。应用程序开发或者设计人员能够快速设计UI,UI都是由ASP.NET Controls 组成,控件与事件绑定的机制能够快速开发相应的业务逻辑去响应控件的事件(通常双击即可)。这种体验与Windows Form 的开发方式一模一样,唯一的区别是Web Form 有服务器端控件和客户端控件(Html 控件)。在服务端把服务端控件渲染成普通的浏览器能够识别的html控件,推送到web浏览器。
对于用户来说,访问网站具体很明确的目的性,比如下订单。从本质上来说,用户要做的是一个动作,而不是访问某个页面。对于ASP.NET来说,用户访问的都是页面,用户与页面的交互是跟控件的事件强耦合的。业务逻辑通常都跟控件,UI有很强的耦合。从下面的例子可以看得出来,我们要针对DataGridView做删除操作,跟控件本身有关系。
从代码复用性的角度来说,这些方法很难被复用,如果希望能够复用,必须做更多工作。这个删除方法在另外一个DataGridView那里就不能够重复使用。
如果开发方式是测试驱动开发的话,对这个方法的测试几乎是不可能的,因为依赖太多的对象,而且这些对象无法抽提接口,所以无法使用MOCK来屏蔽
所依赖的对象对其的影响。
对于用户交互频繁的程序,在业务逻辑里面需要去管理UI,比如禁用和启用控件,改变控件字体的样式,隐藏,显示,颜色,等等属性。
MVC 很好地分离了UI 和 业务逻辑,用户请求的是Action,而不是页面。
public ActionResult Index()
{
List<Employee> listeEmployees = new List<Employee>();
listeEmployees.Add(new Employee(1, "Justin"));
listeEmployees.Add(new Employee(2, "Austin"));
return View(listeEmployees);
}
namespace MvcApplication1.Models
{
public class Employee
{
public Employee(int id,string name)
{
this.EmployeeID = id;
this.EmployeeName = name;
}
public int EmployeeID;
public string EmployeeName;
}
}
View
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication1.Models.Employee>>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
</head>
<body>
<div>
<table>
<% foreach (var m in Model){ %>
<tr>
<td>ID: <%=m.EmployeeID %></td>
<td>Name: <%=m.EmployeeName %></td>
</tr>
<% } %>
</table>
</div>
</body>
</html>
Action传递model到view,view只负责展示的形式,不必考虑其他的。
VIEW可以感知MODEL的变化,因为VIEW可以直接从model取数据,如果交互不严格约束,维护起来很困难,为了解决这个问题,MVP模式就出现了,MVP拒绝VIEW直接操作MODEL,严格按照model->action->view的交互方式。
今天就写到这里,下一章节继续,欢迎关注。