跟我学ASP.NET MVC之一:开篇有益
摘要:
ASP.NET MVC是微软的Web开发框架,结合了模型-视图-控制器(MVC)架构的有效性和整洁性,敏捷开发最前沿的思想和技术,以及现存的ASP.NET平台最好的部分。它是传统ASP.NET Web Form完整的替代技术。在这个篇文章中,我将介绍为什么微软创造了ASP.NET MVC,他跟他之前的技术有什么不同。
ASP.NET历史
要想了解ASP.NET MVC的历史,需要先了解ASP.NET的历史。ASP.NET在2002年创建。他结合了ASP.NET WEB Form技术、ASP.NET IIS技术以及.NET技术。
通过WEB Forms,微软通过将用户接口(UI)建模成一系列分级的服务器端控件对象,隐藏了HTTP(和它的无状态性)和HTML(那时候很多开发者还不熟悉他)。每个控件在HTTP请求过程中保持和记录自己的状态,在需要的时候将自己呈现为HTML元素,并自动连接客户端事件(例如按钮事件)和相应的服务端事件处理器代码。实际上,Web Forms是一个设计成能在Web上发送经典事件驱动用户接口(GUI)的大的抽象层。他的想法是让Web开发感觉就像是Windows Form开发一样。开发者不需要处理一系列相互依赖的HTTP请求和响应。他们只需要关心UI逻辑,微软无缝地将Windows桌面开发者大军传送到Web应用世界。
ASP.NET缺点
- 视图状态负担:实际的在跨请求状态间的维护状态机制(View State)导致了在客户端和服务器端之间大的数据传输。传输的数据在非常简单的Web页面中都可能达到几百KB,并且在每个请求中来回传送,导致非常长的响应时间,以及增加了服务端的带宽需要。
- 页面生命周期:连接客户端事件和服务端事件的代码(一部分是页面生命周期)可能异常复杂和精细。很少的开发者能够成功地处理和控制在运行时的层级关系,而得到视图状态错误,或者出现一些事件处理器在处理器执行时奇怪地失败的情况。
- 错误的分离关注点:ASP.NET Web Form代码隐藏模型提供了一种将应用代码和HTML标记分离的方式。这种分离业务逻辑和表现的方式曾经受到广泛地欢迎。但是,在现实上,开发者被鼓励去将表现层代码和应用层代码糅合到一起到同样的怪异的代码隐藏类。(例如,将处理服务端控件树和处理数据库的代码)。导致脆弱和难以理解的结果。
- 对HTML的控制很有限:服务端控件将自己呈现为HTML,但是并不是你想要的HTML。早期的ASP.NET版本,HTML输出不符合Web标准,不能好的利用层叠样式表(CSS),服务端控件产生不可预期的复杂的ID属性值,使用JavaScript很难访问他们。这些问题在最近的Web Forms发行版本中改进了很多,但是还是会得到非你预期的难处理的HTML。
- 出现裂缝的抽象:Web Forms尝试在任何可能的时候隐藏HTML和HTTP。当你在实施客户行为时,你经常放弃这种抽象,逼迫你反过来使用会发事件机制或者使用迟钝的方式让他产生你想要的HTML。这时候,所有的WEB Forms抽象都变成了Web开发者们令人沮丧的障碍。
- 低测试性:Web Forms设计者们没有预料到自动化测试会变成软件开发过程中一个重要的部分。不出意料的,他们设计的紧密的耦合架构是不适合单元测试的。集成测试也一样受到挑战。
Web Forms不是都是不好,微软已经在提高他的灵活性上付出了很多努力,简化开发流程,甚至从ASP.NET MVC中拿了一些特性。当你需要快速开发的时候(一个相对不怎么复杂的web app一天能开发完毕的时候)Web Form更胜一筹。但是除非你在开发的时候非常仔细,否则你将发现你创建的应用程序非常难以测试和维护。
ASP.NET MVC主要优点
在2007年十月,微软宣告了一个新的MVC开发平台,建造在ASP.NET核心平台之上,清楚地设计成适应革新技术(例如Rails)以及Web Form批评者们的直接响应。下面部分描述新的平台怎样胜过Web Forms的以及怎样将ASP.NET技术重新带到了时代边沿。
区分MVC架构模式和ASP.NET MVC框架比较重要。MVC模式不是新东西-往回到1978年在Xerox PARC的Smalltalk工程-但是现在作为一个模式,他获得了Web应用的巨大的欢迎。有下面几个原因:
- MVC架构
用户跟MVC应用交互按照自然的循环:用户发出一个行为,作为响应系统改变它的数据模型,发送更新后的视图给用户。然后重复循环。这对发出一系列的HTTP请求和收到响应的Web应用非常便利。
Web应用迫使组合一些技术(例如:数据库,HTML和执行代码),将他们分开到不同的层中。从组合这些层的过程中产生的模式自然地映射成了MVC概念。ASP.NET框架实现了MVC模式,在实现过程中,改善了关注点的分离。事实上,ASP.NET MVC实现了MVC模式相当部分的内容,特别适合Web应用。
- 可扩展性
MVC框架建造于一系列的相互独立的基于.NET接口的组件上,并基于抽象基类。你可以非常容易地替换组件,例如用不同的你自己实施的组件替换路由系统、视图引擎和控制器工厂。大概来说,MVC框架给你三个选项:
- 使用默认标准的组件(对大部分应用来说足够了)
- 使用继承类替换默认的组件行为
- 使用新的基于接口和抽象类的组件替换默认组件
紧紧地控制HTML和HTTP
ASP.NET产生干净,标准的标记HTML。基于HTML帮助类方法产生符合标准的输出,但是有一个相对于Web Forms更具有哲学意义上的改变。不是产生一片你不能控制的HTML,MVC框架鼓励你手工写简单优雅的用CSS装饰的标记。
当然了,如果你不想扔掉一些现成的复杂的UI元素小部件,例如日期控件或者层级菜单,ASP.NET MVC很容易使用最佳的UI框架例如jQuery UI或者Bootstrap CSS框架。
ASP.NET MVC 产生的页面不含有任何视图状态数据,因此他们比ASP.NET WEB产生的页面更小。
ASP.NET MVC与HTTP无缝工作。你可以控制在浏览器和服务端之间传递的请求,因此你可以尽量细微地控制你的用户体验。AJAX变得很容易,没有了任何自动的从客户端到服务器端接口的回传。
可测试性
MVC架构让你的应用程序开始有可维护性和可测试性,因为你自然地分离了不同的应用程序关注点。然而,ASP.NET设计者们并没有停留在这里。为了支持单元测试,他们使得框架设计成为以组件为目标的设计,确保每个分开的部分都能够服务单元测试和Mocking工具的需要。
可测试性不只是单元测试。ASP.NET MVC应用程序也可以很好的和UI自动化测试一起工作。你可以写测试脚本模仿用户操作而不用去担心操作的是哪一个HTML元素、CSS类或者框架产生的ID,而且你不用担心页面HTML结构无预期的变化。
强大的路由机制
随着Web应用技术的更新。URL样式也发生了变化。像这样的URL:
/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742
变得越来越少了。被替换成一个更简单干净的下面的格式:
/to-rent/chicago/2303-silver-street
有一些好的关心URLs结构的原因。首先,搜索引擎更看重在URL上找到的关键字。搜索"rent in Chicago"更容易出现在搜索中。其次,许多Web用户现在足够理解URL,能够直接在地址烂输入URL。第三,当人们开始理解URL结构后,他们更有可能链接他,跟朋友分享它,甚至在电话里大声的读它。第四,他并没有暴露你的应用程序的技术细节、文件夹和文件名。
干净的URLs在以前的框架中很难实施,但是ASP.NET MVC使用一个称为URL路由的特性来提供默认的干净URLs。这让你可以控制你的URL模式,以及跟你应用之间的关系。让你自由地创建有意义对用户有用的URLs的模式,而不用服从于一个定义好的模式。当然,这意味着你可以容易地定义一个你愿意的时尚的REST样式的URL样式。
建造于ASP.NET平台最好的部分
微软现存的ASP.NET平台提供了一个成熟的、经过检验的组件集合,适合开发有效高效的的Web应用系统。
首先最明显的,因为ASP.NET MVC是基于.NET平台的,你可以使用任何.NET语言访问相同的API特性-不仅是MVC自身,.NET扩展类框架和广大的第三方.NET框架生态圈也一样。
其次,已经做好的ASP.NET平台特性-例如验证、成员资格、角色、Profile和国际化-能够减少你在开发和维护WEB系统时的代码,并且这些特性在MVC框架里和在经典WEB Form工程里一样有效。ASP.NET平台底层为MVC框架提供了WEB开发丰富的工具集合。
ASP.NET MVC是开源的
不像以前的微软Web开发平台,你可以自由地下载ASP.NET MVC源代码,甚至修改和编译你自己的版本。
跟我学ASP.NET MVC之一:开篇有益的更多相关文章
- 跟我学ASP.NET MVC之五:SportsStrore开始
摘要: 这篇文章将介绍一个ASP.NET应用程序SportsStore的开发过程. 开始 创建解决方案 创建工程 在New ASP.NET Project - SportsStore窗口中,选择Emp ...
- 跟我学ASP.NET MVC之三:完整的ASP.NET MVC程序-PartyInvites
摘要: 在这篇文章中,我将在一个例子中实际地展示MVC. 场景 假设一个朋友决定举办一个新年晚会,她邀请我创建一个用来邀请朋友参加晚会的WEB程序.她提出了四个注意的需求: 一个首页展示这个晚会 一个 ...
- 跟我学ASP.NET MVC之二:第一个ASP.NET MVC程序
摘要: 本篇文章带你一步一步创建一个简单的ASP.NET MVC程序. 创建新ASP.NET MVC工程 点击“OK”按钮后,打开下面的窗口: 这里选择“Empty”模板以及“MVC”选项.这次不创 ...
- [转]我要学ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件
本文转自:http://www.cnblogs.com/lukun/archive/2011/08/05/2128693.html 概述 在ASP.NET MVC框架中已经封装了很多基于Html标 ...
- 跟我学ASP.NET MVC之十一:URL路由
摘要: 在MVC框架之前,ASP.NET假定在请求的URLs和服务器硬盘文件之间有直接的关系.服务器的职责是接收浏览器请求,从相应的文件发送输出. 这种方法只能工作于Web表单,每一个ASPX页面既是 ...
- 跟我学ASP.NET MVC之八:SportsStrore移动设备
摘要: 现在的web程序开发避免不了智能手机和平板电脑上的使用,如果你希望发布你的应用程序给更广大客户使用的话,你将要拥抱可移动web浏览器的世界.向移动设备用户发布一个好的使用体验是很困难的-比只是 ...
- 跟我学ASP.NET MVC之六:SportsStrore添加产品目录导航
摘要: 上一篇文章,我建立了SportsStore应用程序的核心架构.现在我将使用这个架构向这个应用程序添加功能,你将开始看到这个基础架构的作用.我将添加重要的面向客户的简单功能,在这个过程中,你将看 ...
- 跟我学ASP.NET MVC之四:使用Razor
摘要: 视图引擎处理ASP.NET内容,并查找指令,典型情况是向浏览器输出插入动态内容.MVC框架视图引擎的名字是Razor. 在本文中,我将带领读者快速认识Razor,以后你们看到他们的时候能够认识 ...
- 跟我学ASP.NET MVC之十:SportsStrore安全
摘要: 在之前的文章中,我给SportsStore应用程序添加了产品管理功能,这样一旦我发布了网站,任何人都可能修改产品信息,而这是你必须考虑的.他们只需要知道你的网站有这个功能,以及功能的访问路径是 ...
随机推荐
- Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化
Android实训案例(五)--四大组件之一ContentProvider的使用,通讯录的实现 Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯 我们后续也会一一的为大 ...
- Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用动画会有不一样的感受
Android特效专辑(七)--飞机升空特效,一键清理缓存,灵活运用属性动画 最近的几篇博文反响还不错,也会继续的写下去的,关于这些特效的专辑,大多数也是借鉴大神的,最近由于工作的关系,会深入的了解一 ...
- obj-c编程10:Foundation库中类的使用(6)[线程和操作队列]
任何语言都不能避而不谈线程这个东东,虽然他是和平台相关的鸟,虽说unix哲学比较讨厌线程的说...线程不是万能灵药,但有些场合还是需要的.谈到线程就不得不考虑同步和死锁问题,见如下代码: #impor ...
- OpenLayers3的WMS空间查询实现多个图层
空间查询前面的帖子写过,但是在一次性查询多个图层的时候卡了一下,再次记录下. 1.WMS数据源: var wmsSource = new ol.source.TileWMS({ url:'http:/ ...
- 深入理解springMVC思想
转载:http://elf8848.iteye.com/blog/875830 深入理解Spring MVC 思想 目录 一.前言二.spring mvc 核心类与接口三.spring mvc ...
- getElementById 用法的一个技巧
假设实现把 TextBox1 的字符实时的拷贝到 TextBox2 中,代码如下: <Script language="Javascript"> fun ...
- JavaScript 对象分类
参考自W3School:JavaScript对象主要有三类. 一:JavaScript核心对象是ECMAScript标准定义好的一些对象与函数,在JavaScript语言中可以直接使用.主要常用有如下 ...
- List内存分配
当采用默认构造函数List<int> value = new List<int>();实例化一个List<T>对象时,.Net Framework只是在内存中申请了 ...
- WebRTC MCU( Multipoint Conferencing Unit)服务器调研
接触过的有licode.kurento. licode的缺陷:文档支持有限,licode的app client库只有js的 kurento的优势:文档齐全,Demo俱备,封装API比较齐全.它的主要特 ...
- 学习Timer定时器
原文地址:http://www.cppblog.com/ivenher/articles/19969.html setTimer函数用于创建一个计时器,KillTimer函数用于销毁一个计时器.计时器 ...