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语言有一种很深厚的“情怀”(类似老罗对锤子手机的那种),说 ...
随机推荐
- 5.7.13mysql 无法登陆
话不多说 用的http://dev.mysql.com/downloads/mysql/下的ZIP Archive安装方式 下载 解压,然后吧bin目录添加到系统path环境变量下.然后将my-de ...
- shell 学习
将maven 项目里面的jar 包导出目录: 在项目里面执行: mvn dependency:copy-dependencies -DoutputDirectory=lib shell 参数之间必有空 ...
- 学习java的视频资源(尚学堂)(比较老旧,但是还是挺好用)
本人新手,转入IT,一开始在学校的时候看过尚学堂 马士兵讲过的java基础视频教程,这次深入学习呢,就从百度云盘找了一整套的视频资源.之后越深入的学习呢,发现这些视频资源VeryCD上都发布了,地址 ...
- 这是第二道题内容要求写一个银行的ATM系统 这个浪费了好长时间 ,遇到了许多问题,不过都解决了,上程序
下面的4个用户是我宿舍的,当然我是钱最多的,呵呵! #include<iostream>#include<string>using namespace std; class c ...
- ubuntu 开启 rewrite 模块
1.sudo a2enmod rewrite 开启Rewrite模块 (停用模块,使用 a2dismod) 2. 在/etc/apache2/ 修改apache2.conf 文件中把AllowOver ...
- php中的一些编程例子
#一到一百不能被三整除的数 for($i=1;$i<=100;$i++){ if($i%3 != 0){ $arr[] = $i; }} var_dump($arr); #水仙花数for($i= ...
- Git 详细命令集
初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件: 第二步,使用命令git ...
- php pdo mysql数据库操作类
<?php namespace iphp\core; use iphp\App; /** * 数据库操作基类 基于pdo * @author xuen * 支持链式操作,支持参数绑定 * 说明1 ...
- knockout computed实例
function Privilege(options) { var self = this; self.fieldId = options.fieldId; self.readAccessType = ...
- Oracle EBS-SQL (WIP-2):检查非标任务没挂自己本身.sql
SELECT WE.WIP_ENTITY_NAME, MSI.SEGMENT1, MSI.DESCRIPTION, WDJ.CLASS_CODE, WDJ.START_QUANTITY, WDJ.SC ...