MVC自学第一课
了解传统的ASP.NET WebForm
ASP.NET 在02年问世,给Web开发领域带来了巨大转变。下图描述了当时微软的技术堆栈。

ASP.NET WebForm 技术堆栈
(注:此图的含义为,Web Form 建立在ASP.NET 之上,而ASP.NET 又建立在.NET 平台上,MVC所起的作用是替代这里的Web Form。)
学习MVC之前,我们先了解一下传统的ASP.NET WebForm有哪些缺点。
首先如果问你什么是ASP.NET WebForm,这里可能会有人觉得有点懵。生活往往就是这样,有些东西我们心里明明清楚是那么一回事,但就是不知道怎么用语言来表述。
好了话不多说,先上一段个人觉得比较通俗易懂的解释。
- 作用于将用户界面(UI)模拟为服务器端控件对象层的办法,微软试图利用WebForm 把HTTP(具有无状态本质)和HTML都隐藏起来。每个控件在请求期间都跟踪自己的状态(通过ViewState),在需要时把自己渲染成HTML,并自动地将客户端事件(如按钮点击)与相应的服务器端事件处理代码相关联。结果,Web From被设计成Web上传递传统事件驱动式GUI(图形用户界面)的一个巨大的抽象层。其思想是,让Web开发在感觉上与Windows Form开发相同。开发者不再需要以一些列独立的HTTP请求和响应进行工作,可以认为它是一种状态话UI。我们可以忘记Web及其无状态本质,转而用一种(拖——放)式设计器来创建UI,并假象或至少假装,所有的事情都发生在服务器上。
1.传统的ASP.NET WebForm 开发曾是一种了不起的思想,但是事实证明它更加复杂。随着时间的推移,Web Form在实际项目中显现出了一些缺陷:
视图状态负荷
传统的ASP.NET WebForm模式利用ViewState保存表单的状态信息,由于B/S程序本身的限制,ViewState存储数据需要在隐藏表单域里面放置很大一段字符串,这回大大增加页面的字节数,导致网页加载变慢。
页面生命周期
页面生命周期过于复杂。比如控件的Init事件在Page的Init事件之前执行,而Load事件是控件后执行。事件处理的事件
HTML上的受限制
服务器控件将自己渲染成HTML,但并不是我们所期望的那种必要的HTML。 在ASP.NET 4之前,这种HTML输出通常不符合Web标准,或不能很好地使用CSS。而且,服务器控件会生成不可预测的且复杂的ID值,结构这些ID很难用JavaScript进行访问。
关注分离做的不好
Webform开发是一个页面对应一个code-behind class,原本的目的是将展示和逻辑分离。但是在实际开发的时候,面对某些需求,还是经常会在class中写一些控制界面展示的代码。
低可测性
页面和code-behind class绑定在一起,无法单独对逻辑进行测试;不支持单元测试。
当然ASP.NET一直在不断改进,版本2.0添加了一组标准的应用程序组件,可以减少开发者需要编写的代码量。2007年发布的AJAX是微软对Web 2.0/AJAX疯狂时代的回应,它支持富客户端交互,同时简化了开发者的工作,最新版的4.0能够生成等易于预测且与标准兼容的HTML标记,但依然存在许多内在的局限性。
ASP.NET MVC
ASP.NET MVC的优点如下:
- 采用MVC架构:分离了关注点,比如开发Controller的时候,只需关注如何处理交互,从request中获得什么数据,业务逻辑交给Model处理,还需要把哪些数据传给页面用于展示,如何展示交给View处理。
- 更好的扩展性:ASP.NET MVC框架由一些列独立的组件构成,你可以轻松替换,如路由系统、the View Engine、the controller factory或者其它框架的组件。
- 更好的可测性:关注点的分离另外一个好处就是更好的可测性。
- 能够完全控制输出的HTML。
- 强大的路由功能。
下一课再深入的讲解MVC的一些知识。
MVC自学第一课的更多相关文章
- MVC自学第二课
鉴赏一个软件开发框架最好的办法是投入其中并使用它.本课将使用ASP.NET MVC框架创建一个简单的数据录入应用程序.为简化起见,本课涉及到的一些技术细节在这里可能会跳过,会在以后的课程中再详细说明. ...
- C++自学第一课:函数
此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...
- 微信小程序自学第一课:工程目录结构与.json文件配置
注册成为开发者 地址: https://mp.weixin.qq.com/cgi-bin/wx 开发者工具下载地址 https://mp.weixin.qq.com/debug/wxadoc/dev/ ...
- HTML5 —— 自学第一课
1.心得 首先遇见问题要寻根源,而不是将问题抛出:其次要经常查看参考文档.参考示例:学会百度. 2.技能需求 HTML5.XHTML.CSS3.JavaScript.jQuery(jQuery-UI/ ...
- Laravel自学第一课:laravel下载与安装
本地安装laravel,php环境要配置好,推荐xmapp一键搭建. 1.程序包直接从官方下载,官方开源地址:https://github.com/laravel/laravel(当然也可从此网站:h ...
- 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
blog.csdn.net/totogo2010/article/details/8205810 目录(?)[-] 第一课名称 MVC and Introduction to Objective-C ...
- C++自学教程第一课——你好世界,我是柠檬鲸。
C++系列教程现在在自己学校的一个博客平台发布,几个朋友一起搭建的 [C++基础教程系列](https://blog.ytmaxoj.org/cpp_basic_liuary-0/) 下面是原来的正文 ...
- CodeIgniter框架入门教程——第一课 Hello World!
本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...
- 【C语言探索之旅】 开宗明义及第一课:什么是编程?
内容简介 1.课程大纲 2.第一部分第一课:什么是编程? 3.第一部分第二课预告:工欲善其事,必先利其器 课程大纲 不知道为什么,一直对C语言有一种很深厚的“情怀”(类似老罗对锤子手机的那种),说 ...
随机推荐
- jquery精简选项卡
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8&qu ...
- IE9下Ajax缓存问题
使用jQuery的getJSON从后台定时获取数据并刷新界面,使用以下方法时,在Chrome,Firefox下没问题,但在IE9下却无法刷新数据 $.getJSON(webApp + "/G ...
- SQL Server 文件流文件组
背景: 文件流通过在文件系统上存储blob数据文件将数据库引擎与ntfs文件集成在一起,使用t-sql和win32访问数据. 文件流使用windows系统来缓存数据,有助于在减少文件流数据对sql s ...
- 快学Scala习题解答—第一章 基础
1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...
- 普林斯顿大学算法课 Algorithm Part I Week 3 比较器 Comparators
比较器接口(Comparator interface):用可选顺序(alternate order)进行排序 public interface Comparator<key> int co ...
- 普林斯顿大学算法课 Algorithm Part I Week 3 归并排序 Mergesort
起源:冯·诺依曼最早在EDVAC上实现 基本思想: 将数组一分为(Divide array into two halves) 对每部分进行递归式地排序(Recursively sort each ha ...
- aix archPlat
#++++++++++++++++++++++++++++++++++++++++++++++++++++ #+ Ruiy(R) Techdiss contact: 150 5519 8367 #+ ...
- java快速排序1000万无序数组JVM-Xmx=256M 耗时2s
自己动手写排序算法,快速排序是比较不好写的了~ import java.util.*; class Test{ public void quickSort(int[] arr,int low,int ...
- SDUT OJ 2783 小P寻宝记
#include<iostream> #include<memory.h> #define N 10020 using namespace std; int dp[N],pi[ ...
- extern外部方法使用C#简单样例
外部方法使用C#简单样例 1.添加引用using System.Runtime.InteropServices; 2.声明和实现的连接[DllImport("kernel32", ...