ASP.NET MVC4 Web 编程第二章

尽管 asp.net mvc架构和web form架构区别很大,但是还是有很多共同之处,毕竟它们都是以ASP.net api和.net框架为基础构建的,所以,如果打算学习asp.net mvc 并且从事Web Form开发,那么算是已经提前开始了。

本章将会比较asp.net mvc和web form框架,以便知道有多少Web form概念与asp.net mvc开发相关,注意,本章的目标是帮助那些想学习asp,net mvc开发的 web form开发人员尽快转变思维,以适应新的开发框架,如果不熟悉 web from框架,则可以考虑跳过本章(译注1)直接看下面的章节。

也许我们不知道,基于.net平台开发网站的框架(你可能称之为“asp.net”)实际上可以分成两个部分。可视化用户界面(web Form)和后台web组件asp.net 。两者可以通过他们的命名空间区分开:所有System.web.ui.*命名空间下的内容称为Web form,而SYSTEM.web.*命名空间下的其他内容可以称为Asp.net。

与web form一样,asp.net mvc(所有类都在System.web.Mvc命名空间下)也是基于Asp.net平台构建的,所以两个平台可以十分相似,也可以完全不同,这取决于怎么看待这个问题。本章介绍两者的相似之处,而其他章节则会介绍它们的区别。

工具,语言和API

对于初学者来说,两个框架都使用并扩展了.net框架,本质上,两者都可以使用c#和VB.net来访问.net框架,当然也支持.net框架上的任何语言。

个人墙裂推荐,作为Asp,netWeb开发技术人员,有必要阅读本章,本章的只是可以帮助你了解Web开发框架的基本原理,两种架构的不同设计原则,能为以后的Web架构设计提供充足的参考依据。

这个特性让现有的asp.net代码具备了高复用性,例如,如果已经有一个Web form网站,他使用了System.xml api访问xml文件,那么,就可以很轻易的在Asp.net mvc网站中复用这部分代码,或者稍加改动即可。

大家应该对使用vs编辑asp.net mvc网站及其项目不会感到陌生,这和Web form网站开发一样,都是基于.net平台的应用程序,还可能要注意另外一些共享文件,比如web.config和Global。asax,他们在Asp.net mvc和web form应用中起着重要作用。

http处理程序和模块asp.net mvc和web form共享的最著名的部分应该就是Http处理程序和模块,虽然大部分Web form Api(system.web.ui命名空间下)不会在Asp.net mvc程序下运行,但是Http处理程序和模块确实是asp.net(system.web)api的一部分,所以它们仍然会在asp.net mvc上下文里发挥作用,事实上,asp.net mvc管道本身正是从使用Http处理程序处理外部(译注2)请求开始的。

 确保已经阅读了本章关于asp.net mvc和web form 的却别以及如何使用Http处理程序和模块的内容,http出路i程序和模块依然使用在ASP.net mvc程序里,记住,有几种情况,比如View state(视图状态)不能在Asp.net mvc程序使用。

管理状态

管理状态既与用户相关的数据,在每个程序里都是非常重要的内容,web的无状态性(译住3)导致web应用程序中的管理状态数据变得相当复杂。

为了处理管理状态这个问题,asp.net web form引入了“视图状态”的概念,每个请求的状态数据,在序列化之后会临时存储在页面的吟唱域控件里,随后的请求都会回传这些数据。视图时ASP.net web form的重要部分,几乎每个页面和组件都会后多或少依赖于它,视图状态抽象也有他的缺陷,每个包含视图状态的请求必须以Form post方式提交给服务器,而哪些隐藏域的数据大小令人头疼,平时用不到,有时候却有非常大。

2.Http处理程序和模块属于asp.net管道的两个部分,Http处理程序负责处理特定类型的请求消息,常见的处理程序如aspx。爱上模型,html页面,javascript,图片等;模块可以拦截所有请求,比如可以自定义特定模块来实现安全验证,日志,统计信息等,两者的更详细信息可以参考msdn

3.web的无状态性这个问题我在”WCF分布式开发技术课程“之Restwcf服务以节中有专门的介绍,Http规范本身是无状态性的很多动态网站开发框架为了解决这个问题,都提供了自己的机制,如asp.ne框架的会话功能。

状态管理解释了asp.net mvc 完全不同的状态管理方法,它留给开发人员去实现(或者不实现,最重要的是asp.net mv完全抛弃了视图状态机制)

幸运的是,除了视图状态,asp.net还提供了其他集中状态光里方法,同样可以ziaasp.net mvc里使用,例如,可以使用asp.net缓存和绘画转台或者HttpContent。Item apl,这写可以帮助你在asp.net mvc应用程序里管理状态。

部署和运行时

asp,net mvc的产品环境部署和Web form程序一样,这意味着之前学的的关于部署和维护asp.net 程序的任何东西,比如IIS,.net应用程序池,跟踪,错误调试和部署程序集bin文件夹等,同样可以应用到asp.net mvc程序的部署中来,虽然asp.net mvc和webform程序采用了不同的架构,但是,从更根本上说,两者都是部署并执行。net代码来处理Http请求的。

前文介绍的两者共同点可能让你感觉asp.net mvc和web form框架看起来是一样的,其实只要我们深入了解他们就会发现更多地差别。

表对比了两种框架的不同之处

 两个框架都会基于asp,net 平台构建的,所以有很多种方式可以让webform做到asp.net mvc的燕样子,当然,反过来也一样可以实现,也就是说,可以吧MVC开发技巧应用到Web form上,反之也成立。

不管怎样都请记住,本章关于两种框架的比较参考了各自框架的开发时将,比如微软官方的文档和教程。

应用程序业务和视图分离

asp mvc和webform最大的区别就是他们各自采用基础架构概念

例如,form框架引入初期,就声称相比前任asp框架,他能提供更好的分离关注点支持,asp强制开发人员把业务逻辑荷叶面标记语言混合在单个页面里。web form框架不仅可以让业务逻辑和标记语言代码分离,还可以提供更强大的开发平台。net框架,可以基于此平台编写业务逻辑代码,但是尽管web form框架相比传统的asp框架更加先进,但是他依然关注与网页上;虽然期待吗可以只到别的地方,但是仍然很难做到业务逻辑代码和用户视图分离

mvc 通过集成松耦合组件来处理请求,构建于“分离关注点”概念之上,这个方法隔离了单个的组件开发,不仅有利于开发生命周期,跟有力与组件的测试工作,同样,他也让动态处理请求更加方便,下面的章节里会做介绍

URL和路由

web form架构下,每个网站的Url有单个的物理文件.aspx辨识,而且每个页面与单个页面类紧密耦合,页面无法选择自己绑定的类,代码后之类无法渲染别的视图。

web form框架基于页面的请求处理方式与asp.net mvc的请求处理放啊哈斯形成鲜明的对比,后者依赖于复杂的路由规则动态映射外部的Url到正确的控制器操作上,并允许操作动态指定要显示给用户的视图。

例如,请求处理管道在处理来自用户浏览器跳转到Url的结果和处理ajax请求的结构可能不同,这是应为ajax请求消息投包含了以个辨识ajaxy请求的数据,用户直接访问url时,服务器可能返回包含整个页面内容的Html代码,javascripot和css;而ajax请求放回的只是Auction对象的序列化数据,此外,服务器可能选择不同的格式来序列化Auction对象没比如json或者xml,这些取决与请求要求的数据格式。

web form框架本省并不支持这种动态处理请求的功能,需要借助Http处理车需和模块才能实现

asp,net 的路由功能不是只有mvc程序可以使用,web form程序同样可以使用,

两者使用路由的不同之处是asp,net mvc框架离不开路由组件,而Web form程序使用路由可以避免与页面路径相关的限制,从而获得对url更好的控制。

状态管理

asp.net mvc和web form 最具争议的区别也许就是他们如何跨请求处理用户的状态信息,特别是mvc抛弃了视图状态,为什么要删除这么重要的功能呢,简单说就是mvc完全拥抱了web标准的无状态属性,为了更好的理解这种设计的初衷,我们先来回顾web from的历史。

此外,除了比asp提供了更好的开发平台外,web form框架的另外一个特点就是引入了一种厚重的原生客户端应用开发技巧,比如拖放控件“以及快速开发”Rad的概念到Web开发中。

为了体验原生客户端部应用开发,webform必须在web开发的基础概念入html标签以及css之上抽象出一层,原生应用程序开发中最重要的概念就是有状态的们这意味着应用知道交互的用户状态,并且可以再夸应用之间重用状态信息。

web是基于Http请求的,每个请求对应一个哭护短和一个服务亲应答,web服务亲必须分开处理me讴歌请求,因此无法知道客户端请求的青后消息,这就然服务器和客户端无法进行有效的会话。

为在无状态的中介商实现有状态的交互,必须抽象出来一层,这样,视图状态就诞生了,简单的说,视图状态序列化了客户端和服务器着急哦按的交互状态信息,并把他们存储在每个页面的隐藏域中,随后发送给客户端,客户端需要在后续的请求中把这些会哈状态信息传回给服务器端。

mvc框架保留了web无状态的本性,但并没有提供类似视图状态的机制,而是利用了缓存和会话状态,相反,mvcmvc框架希望客户端请求宝行所有需要的数据,以便于服务端处理它们,例如mvc应答消息也许可以使用Auction的ID而不是从数据库里查询出auction数据后序列化整个对象发送给客户端,并在后续请求里再回传给整个对象,后续请求可以知己使用auction的ID,mvc控制器可以使用它从数据库里插叙auction数据

显然两种方法各有千秋面试入状态让客户端和服务器端的交互更加简单,但是它包含的数据可能会哦变的臃肿,占用大量的带宽,换句话说,视图状态意味着开发人员可以省去很多麻烦,但回忆占用带宽为代价,当然,如果开发人员不考虑每个页面的存储数据,则问题可能会变得更糟。mvc的方法可以从某种程度上削减页面内容,但是可能增加后台处理请求和数据库请求的成本。

渲染Html代码

每个网站各不相同,但是所有的万丈都有一个共同点,生辰各自需要的Html代码,所以,web开发框架的首要任务就是帮助开发人员高效的渲染Html代码,mvc和web form都可以完美的渲染HTML代码只是方法差别比较大。

web form视图比较容易区分,web form视图里的各个控件,从lable到特定的ajax控件都使用服务端控件来渲染html代码。

例如下面就是一个典型的web form页面html视图:

 

现在,对比上视图和一下Razor的代码,二者是等价的;

 虽然两种方式不同,但是两者都可以高效的渲染HTML代码。

注意:Razor采用了更加专注于代码的方式类生成HTML,它依赖于像foreach循环这种特定的代码而不是特定的服务端控件,比如

比较web form和Razor在渲染简单的Url链接是的啊代码区别下面是asp,net web form的实现代码:

 Razor语法的实现代码如下

 这两个例子代表了两者框架的区别,Razor帮助开发人员编写HTML代码,而web form视图依赖于服务端控件来渲染HTML代码

HTML帮助方法与服务器控件

再来回顾一下上一届的内容,应为这相当重要,使用web from框架的抽象几支笔完全可以只使用服务器恐不能干开开发整个页面而不需要使用Html标签,这些服务器控件已经分装到web form框架里,可以直接使用他们来开发出Html页面功能。

与此同时用asp,net mvc方法渲染H太慢了代码的方式正好与web form相反,应为他要求开发者编写更多的H太慢了代码,但是这并不是说mvc无法版主生成html代码,它可以通过html帮助方法类帮助渲染html代码,开发人员可以直接在试图里调用他的方法。

从逻辑上讲,html帮助方法和服务器控件的效果一样,他们都是基于组件的,并且在视图里执行版主生成html代码,这样就可以减少开饭人员的工作量,提高开发效率。

html帮助方法和服务器控件主要的不同之处就在他们的技术实现上,服务器控件时继承自默写成熟的基类,而html版主方法扩展了asp,net mvc视图对象的HtmlHelper对象。

html帮助方法和服务其空间的另外一盒重要的不同我萌在本章多次提到,服务器空间可能使用了视图状态,而html帮助方法缺完全没有使用。

除了这些不同之外,大部分服务器空间使用了与html版主方法等价的类。

与webform 标签不同,mvc提供了Html.actionLink()方法。

这个列子给Html.actionlink床底参数用于显示文本,操作和控制的名字。它们的名字会用来构建url渲染如下

 与webform不同,asp,net mvc并没有提供生成全部html代码的版主方法,试试他提供了可以省城大部分和兴H太慢了代码的帮助类。

与web from服务器控件一样,也可以自由创建自己的Html帮助方法,分装高福永性的渲染逻辑代码。

部分视图与用户控件

Html帮助方法某一web form的服务器控件等价,mvc的部分视图与webform的用户控件本质上是同一个东西,视图被分别存放在不同的文件里,允许开发者把大部分视图文件分割成小视图文件,然后在运行时动态组合,与用户控件一样,部分视图提供了疯转视图2模块的绝佳方式,我们可以在不同的视图重重用这部分代码。

布局与母版页

最后我们累看一下视图种最重要的最基础的概念值以布局,呀可以定义页面结构以及网站主题,并且与所有的页面共享这个主题,这个概念类洗浴asp,net web form 中的母版页,在asp.net mvc框架中称之为布局

asp.net mvc布局可以让开发人员定义每个页面共享的Html代码,与母版页一样,asp.net mvc布局允许开发人员制定多个内容块,与web form的内容页一样,asp.net mvc视图也可以指定想要在哪个视图里渲染,但是,有一个主要区别,对asp.net mvc管道来说,设置仅仅作为推荐,我们也可以随意修改视图的布局,包括删除或者完全使用无布局来渲染视图,比如在Ajax请求的情况下。

使用web form语法编写asp,net mvc视图

既然到了本章的末尾现在是售后揭开哟个秘密了:Razor并不是开发mvc视图的唯一方法,事实上,如果你对web form语法还痴心不悔,藕断丝连,name就可以继续使用web form的语法来开发mvc视图。

现在,不要兴奋过偶头啦记住,只是可以使用web form语法,而不是其框架换句花说,本章介绍的内容都是正确的,无论使用he种语法,url路由仍然会运行那个控制器,显示那个视图;asp.net 服务请控件不能工作而且更重要的是不可能在使用视图状态了。

所有的一切表明,使用web form语法来编写asp.net mvc视图代码只能在。aspx,ascx和睦版页里使用《%%》

母版页是个例外,但是它们可以象在webform程序里一样继续工作,所以asp.net mvc视图可以利用分离网站html和单独内容页代码的优势。

其实 asp.net mvc 不仅支持Razor和web form语法,还可以混用它们,例如,Razor视图可能调用@html.partial("MyPartial"去引用MyParital视图,而这个视图碰巧是个Web Form 控件,但是不能混用布局样式,因为Razor布局和web form母版页方法两者并不兼容,这意味着Razor视图不能引用web form模板,web foem内容页不能引用Razor布局。

要点提示

虽然我们在本章花费大量的篇幅来讨论如何把现有的web form开发技术应用到asp.net mvc中来,但是如果拥有多年的web form开发经验,name学习asp.netmvc是可能也有缺点:除了他们的许多共同点和相似性之外,asp.net mvc和web form框架架构和设计目表在根本上是不同2的,如果你习惯与web form方式,而且喜欢吧这些方法用到asp,net mvc中来n那么可能会带来问题。

如果在开发中我们不断地问自己,这个符合mvc方法吗,或者我是否完全使用了asp。net mvc框架的功能,就可以完全利用web form的开发技巧并避免这些错误。

原文地址:https://www.cnblogs.com/555556J/p/13571659.html