首先说说
MVC与WebForm的区别(来自birdshover的文章):
使用ASP.NET MVC框架,创建默认项目,第一直观感觉就是地址都是Rewrite过的。对源码和配置文件稍加分析不难看出,MVC使用了httpModules来拦截地址请求,具体用到了System.Web.Routing类库(MVC2中,MVC1怎么用的忘记了。)而这部分类库被包装在.NET Framework3.5 SP1中,MVC2需要SP1支持也就理所当然了。SP1提供的System.Web.Routing类库可以方便地进行地址请求拦截,对编码处理方面也很优秀。UrlRoutingModule类拦截请求,在这之前,Application_Start的时候,会给RouteTable的全局对象一个拦截的设置。而这个设置使用RouteCollection对象进行保存,MVC对这个类进行了扩展——RouteCollectionExtensions。这些可以不考虑,接下来,当用户访问页面时,UrlRoutingModule类拦截请求,在RouteTable中查看是否符合规则,符合的话,就会调用MvcHandler,这个调用在httpHandlers配置节点被注册,条件是地址符合“*.mvc”规则。MvcHandler的ProcessRequest方法就会调用Controller来执行。事实上整个过程都是黑盒子,用户感觉不到。在Controller中某方法执行后,返回结果,再进入具体的aspx页面。
分析了MVC的工作工程,就可以对比其与WebForm的区别了。我们知道,MVC模式的业务被放置到Controller中去执行,而aspx页面只负责显示。那么在MVC中的业务实际执行时间被提前到了HttpMolde中,而WebForm的请求只在httpHandler容器中被执行。也就是说MVC中Controller与View的分离是使用的ASP.Net请求管道隔离的,这样的话无疑在不影响效率(一次请求,而Response.Redirect是二次请求)的情况下达成了代码的逻辑层次的分离。
图1 MVC工作模型
MVC工作的优点是显然的,更加有利于理解分层逻辑,把握代码的层次感。Controller到aspx页面之间的过程,已经被框架隔离。至于Controller或者View页面与Model调用的过程,还是需要自己来把握。ASP.NET的MVC框架实现了Controller代码的单独管理。
而看WebForm开发模型,则只在HttpHandler容器中执行,对其进行分层,在大的方面缺乏支持,而只能依靠逻辑上分离。并不是不能分离,而是由一定的局限性。HttpHandler的拦截,是跟访问后缀名有关的。当请求一个页面时,那就是一个Handler,而WebForm模型实现显示与逻辑分离,才有的是WinForm的事件驱动。显然,事件必须被注册到页面里,比如Button1_Click这样的代码。而在Button1_Click执行之前,Page_Load方法会被执行。显示代码被写入Page_Load方法中,那么就会造成需要写额外的废代码,比如if (!Page.IsPostBack)这样的判定。而在Button1_Click执行后需要显示的部分,则比较难处理,写出另一个方法,也是必须要在Button1_Click里调用的。替代的解决方案是使用Response.Redirect,在一个aspx页面中处理逻辑,处理完就跳转到另外一个显示的页面。这样做的坏处是,在两个页面中数据很难共享,而跳转是通过标记302来实现,因此多一次请求。而另外还可以通过Server.Execute,Server.Transfer或者Context.RewritePath这样的处理方式,则两个页面转换是在服务器端完成,可以共享数据,可以说和MVC框架的处理方式大同小异,缺点是需要手动配置这些重新定向的属性。
从以上分析可以看出,MVC框架具有很强的优越性,而WebForm也不是一无是处,在简单的应用中更加容易开发。WebForm也是可以实现和MVC一样的分层方式,只是处理时需要多写一些代码而已。而我认为,在用WebForm开发分层遇到的最大问题是页面与页面之间数据的传递问题,而掌握好WebForm中使用服务器端跳转的应用技巧(Server.Execute,Server.Transfer或者Context.RewritePath)进行开发就可以解决数据传输问题,用WebForm开发比MVC框架更容易理解,不会产生复杂的配置,也是一个很不错的选择。
当然asp.net mvc目前最稳定应用最多的版本也就是mvc 2.0,类似于silverlight 4.0一样。下面对3个版本进行比较概述:
ASP.NET MVC 1.0 个人觉得可能会跟.NET FRAMEWORK 1.1一样,只是个过渡的版本
从目前使用ASP.NET MVC 1.0的情况来看,ASP.NET MVC 1.0还是存在很多问题的;
ASP.NET MVC 2.0 新特性
区域(Area
异步Controller & Action
强类型inputHelper
强类型Link Helper
支持Data Annotations
改进了缓存方式
数据标记验证(Data Annotation Validation)
强类型UI辅助方法和模板化辅助方法(TemplatedHelper)
其它改进
ASP.NET MVC 3
建立在ASP.NET MVC 1和2的基础上,新增了更多功能,既简化了你的代码又允许更深的扩展性。经过很长一段时间的测试后,微软日前发布了ASP.NET MVC 3的正式版,其安装步骤与ASP.NET MVC 2完全相同。
ASP.NET MVC 3主要新增功能:
- Razor 视图引擎
- 支持多视图引擎
- Controller 改进
- Unobtrusive JavaScript、jQuery Validation和JSON绑定带来更加丰富的JavaScript支持;Model 验证的改进
- 依赖注入 Dependency Injection 的改进
-
新的依赖注入(Dependency Injection)和Global Action Filters带来更强大的hooks;
-
完善后的模型验证(Model Validation)提供了更流畅的验证。
- 其他新特性
最后简单总结:
view接收用户输入,把命令传到controller
controller处理命令,更新model
model被更新后,会通知view需要update
view更新后向用户显示
mvc3很像 ruby on rails
另外把每个版本的release note看一下也可以知道具体的区别
把ASP.NET MVC1.0转为ASP.NET MVC 2.0项目的两种实现方法
安装了VS2010的人估计都比较头疼那些MVC1.0的项目无法再MVC2.0里面打开。毕竟网上大部分例子还是1.0的。
转化方法1:
微软官网推荐的。
a. 备份你需要转化的项目文件。
b.使用记事本打开需要转化的工程文件即:.vbproj或者是csproj,然后找到ProjectTypeGuid这个节点,把 {603c0e0b-db56-11dc-be95-000d561079b0}替换为{F85E285D-A4E0-4152-9332-AB1D724D3325}。然后保存文件。
c.打开这个项目的Web.config文件,查找'System.Web.Mvc,Version=1.0.0.0'并替换它们为'System.Web.Mvc, Version=2.0.0.0'。保存你的配置文件。
d.使用Visual Studio打开项目,然后在'引用'中倒找System.Web.Mvc,删除掉;以为它是1.0版本,我们删掉后,再把新的2.0版本的System.Web.Mvc添加到引用中来。
5.打开web.config文件然后在configuration节点部分添加如下部分(也可以不添加,我试过了)
代码
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
然后编译一下就OK了。
第二个方法是使用一个工具来自动转化:
你可以下载这个工具:MvcAppConverter-MVC2RTM.zip (255 KB).