浅谈ASP.NET MVC

在正式的工作中使用ASP.NET MVC也有一阵子了,也看了听了很多关于ASP.NET MVC别人的想法和代码,我认为很多人对于它的理解是错误的。

在这里我只谈谈对ASP.NET MVC我的一些想法,希望大家多多讨论。

1. ASP.NET MVC区别于ASP.NET在于设计理念

我听过的关于ASP.NET  MVC的第一个看法是ASP.NET MVC最大的特点在于Controller和View的分离,当时我还不懂ASP.NET MVC是什么东西,但是当我第一眼看到这个框架时,我就认为这个观点是错误的,我认为ASP.NET MVC最大的特点,也是最大的优点是由Controller来驱动整个项目的开发进展。

我们知道,在一个项目的面向对象分析与设计过程中,我们一直都在围绕着人,可能是角色,也可能是涉众来分析和设计整个项目。人,全都是人!站在整个类设计结构最上层的就应该是人,然后我们接下来应该去分析这个人有什么特征,我们这个人要做什么(记住,而不是这个人可以做什么)。也就是说,除了人之外,接下来的层次就应该是这个人的行为,也就是整个系统中的Action。

好,接下来我们可以回想一下我们最初的ASP.NET Webform时代,我们是如何开发一个系统的,我们写出一堆设计文档,然后美工给我们页面,然后就是我们常说的“套页面”。对于这个做法,也就是我在之前文章中调侃的“PDD”(页面驱动开发)。缺点我就不说了,在前文中我想我已经说得很清楚了。

那么我们想想,其实我们会觉得Webform是个天然为了PDD而生的产物。当提及三层架构时,很多人都有一种看法是ASP.NET本身就是三层的,我们暂且不管这个说法对不对,至少可以说明,很多人都天然地把.aspx.cs当成了其中的一层,这就造成了aspx和aspx.cs这两层的完全耦合性。

但是ASP.NET MVC好在哪里?一个用户访问,并不是在访问某一个页面,而是在访问某一个功能(Action)。这就是面向对象分析的最基础方法。

那么我们在开发ASP.NET MVC时就应该先考虑我们需要哪些功能块,这就是我们的Controller,然后在这个功能块下,我们都需要哪些功能,这就是我们的Action。至于页面,应该是应该由功能来驱动我们的页面开发,这才是Controller驱动整个项目开发的核心!

但是我想仍然有很多公司在用开发ASP.NET时的那一套PDD来开发整个项目,我想,这就是没有掌握到ASP.NET MVC的精髓之所在吧。

ASP.NET MVC要点一:先开发Controller,页面完全可是先束之高阁,由Controller而不是Page来驱动整个项目开发。

2. Controller的代码组织

在整体的架构中,个人认为Controller更像一个Facade,他提供给用户一个访问接口,在这个接口背后是复杂的业务逻辑。

但是我看到很多公司的代码都在Controller掺杂进了复杂的业务逻辑,甚至会出现了几百行,几千行的Controller,这是我没办法理解的。

让我们想想Facade,他的目的是这样的:定义一个高层接口,这个接口使这一子系统更加容易使用。

在我看来应该注意这样几点:

A. Controller中不应该包含任何private和protected方法,一个Facade类只应该由对外暴露的方法,他只是对其他类方法的整合。

B. Action不应该处理任何细节方面的逻辑。个人认为,每个方法之中仅应包含他下一抽象层次的方法,而不应该出现抽象层次的杂糅以及抽象的层次跳跃。

C. Action本身其实就是一个方法,正如代码规范上所说的,方法应该只是动词或者动宾短语,而不应该出现名词作为方法名的情况。因为用户是希望做某一项动作,而不是得到某一种东西。

3. 最后

本来感觉有好多话想说,可是写着写着却发现不知道该写什么了,下次再说吧。

最后,个人建议,学习ASP.NET MVC可以参考一下Java界的一些成熟思路,有些其实和ASP.NET MVC非常像,比如Struts,还有Spring MVC。

打算接下来的时间看一下。欢迎大家共同讨论学习。

时间: 2024-09-23 15:29:51

浅谈ASP.NET MVC的相关文章

浅谈ASP.NET MVC 3中如何使用Model

昨天博客发了新文章,讲一下我对如何使用MVC中的Model的看法,不是什么大技术,当是一个技术讨论^^ 原文地址:http://www.youguanbumen.net/Article.aspx?id=79 原文: 前两天写了个文章ASP.NET MVC 3 -- Model远程验证,主要记录了一下ASP.NET MVC 3中新增的RemoteAttribute类的使用,得益于这个类,我们可以在模型中为属性配置客户端远程校验的业务,文章中给了出一个简单的实体类MyUser_Add,举了一个最常见

浅谈ASP.NET MVC在前端开发中的局限性

ASP.NET MVC 如果你还没有接触过后端的MVC框架的话,不妨先看看下面这段ASP.NET MVC代码并且了解一下后端MVC的工 作原理.它摘自ASP.NET MVC教程中非常著名的项目MVC Music Store一段Controller组件代码: public class StoreManagerController : Controller { private MusicStoreEntities db = new MusicStoreEntities(); // GET: /Sto

浅谈ASP.NET MVC框架

服务器端的实现原理并不复杂,不过作为解决方案的另一个关键部分,如何在客户端触发一个AJAX提交也是一个值得思考的话题. UpdatePanel的方式可谓"全自动":页面加载时将会把服务器端的Trigger信息输出至客户端,然后在客户端截获form的提交事件,并通过 UniqueID或DOM结构等方式来判断这次提交是否该转化为AJAX方式.不过在一个ASP.NET MVC页面中几乎不会出现产生PostBack的元素,相反会有大量的普通链接,它们才是AJAX更新的主要截获目标. 为此我提供

浅谈ASP.NET MVC应用程序的安全性_实用技巧

前言:保护Web应用程序的安全性看起来时间苦差事,这件必须要做的工作并不能带来太多的乐趣,但是为了回避尴尬的安全漏洞问题,程序的安全性通常还是不得不做的. 1.ASP.NET Web Forms开发人员   (1)因为ASP.NET MVC不像ASP.NET Web Forms那样提供了很多自动保护机制来保护页面不受恶意用户的攻击,所以阅读本博客来了解这方面的问题,更明确的说法是:ASP.NET Web Forms致力于使应用程序免受攻击.例如: 1)服务器组件对显示的值和特性进行HTML编码,

一起谈.NET技术,浅谈ASP.NET MVC

在正式的工作中使用ASP.NET MVC也有一阵子了,也看了听了很多关于ASP.NET MVC别人的想法和代码,我认为很多人对于它的理解是错误的. 在这里我只谈谈对ASP.NET MVC我的一些想法,希望大家多多讨论. 1. ASP.NET MVC区别于ASP.NET在于设计理念 我听过的关于ASP.NET  MVC的第一个看法是ASP.NET MVC最大的特点在于Controller和View的分离,当时我还不懂ASP.NET MVC是什么东西,但是当我第一眼看到这个框架时,我就认为这个观点是

浅谈ASP中Request对象获取客户端数据的顺序

request|对象|客户端|数据 浅谈ASP中Request对象获取客户端数据的顺序 /**描述:在使用ASP Request对象时需要注意的小问题作者:慈勤强Email : cqq1978@yeah.net**/ 在ASP中Request对象是获取客户端提交数据的一个很重要的对象,大家对他也是非常熟悉了.虽然如此,还是经常有人问我下面的几种写法有什么不同,到底应该怎么写?strMessage = Request("msg")strMessage = Request.Form(&qu

浅谈ASP.NET的Postback

说道ASP.NET的Postback,就得说Web Page的生命周期,但是Web Page的生命周期却不是三言两语就能够说得清楚的,所以在这里单纯站的编程的角度,撇开Web Page 的生命周期浅谈Postback. 我们知道,无论是ASP.NET1.x,2.0,甚至是以后的版本,ASP.NET最终Render到Client端通过浏览器浏览的都是一样:一个单纯的HTML.Client通过Submit Form的方式将填入Form的数据提交给Server进行处理.我们现在来看看ASP.NET整个

浅谈对.NET MVC框架的理解

近来我发现有很多关于.NET MVC框架的文章,大家写的也都非常好,也很深刻,我今天也大概看了一下, 顺便用它做了个小留言本,在这里我也来分享一下我的经验,同时也希望大家给出指点,我们大家来共同学习和进步! 第一,我想说一下,对我感触最深的地方就是它对httphandler的处理,学过ASP.NET的人可能都知道,每个页面其实就一个httphandler,我记得那时候刚接触地址映射技术的时候,费了很大的事,既要在配置文件里配置路径和映射规则,又要实现Ihttphandler或者ihttpmodu

浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能_实用技巧

今天在使用MVC4打包压缩功能@Scripts.Render("~/bundles/jquery") 的时候产生了一些疑惑,问什么在App_Start文件夹下BundleConfig.cs文件内 bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js", "~/Scripts/jquery.unobtrusive-a