混乱的MVC,.NET非要MVC不可么?

最近流行MVC,不是因为大家都在用,而是他已经在.NET缺席N多年。本文题目是乱取的,吸引眼球而已

MVC是一个非常有争议性的话题,首先,什么算是MVC,没有一个统一的说法,众说纷纭,java,php都在争吵不休,就跟别说已开始就压根没打算MVC的ASP.NET。在大家被微软用CodeBehind和CodeBeside忽悠过去N多年之后,当大家在对WebForm审美疲劳后,MVC就跟李宇春一般另类且充满吸引力。最近的新闻是微软也要在ASP.NET中推出MVC了。对于很多M饭来说是一个十分值的庆祝的事情。顺带着MonoRail也鸡犬升天,关注的人越来越多。WebForm未死,MVC却活过来了。

所以这就是我不得不来发表对MVC一下看法的原因。

上帝说“你应该了解真相,真相使你自由”

什么是MVC的真相呢?我想从来源说起

话说N多年前,在一个叫SmartTalk的国度出现了一个叫MVC的家伙,后来流窜到了java国,在Java国里呼风唤雨(java的很多有界面的组件,比如swing都是采用MVC模式设计的)。

这个MVC是个什么样的家伙?

首先,此人长了三只手。一只叫Model,它负责业务领域状态的知识,一只叫View,负责业务领域的表示视图,一只叫Controller,负责控制用户输入的流和状态。当模型某一部分发生变化的时候,通常使用事件通知表单来通知视图。但是这个家伙在Web上操作的时候遇到了麻烦。因为Web的浏览器是没有状态的,所以模型没有办法通知视图发生变化,而必须通过用户发出另一次请求才能知道模型的改变。(以上内容源自《jakarta struts编程》一书)

所以这个家伙就将我迷惑住了,如果用户需要请求两次,那么整个过程的入口在那里?View还是Control?

在微软忽悠的MVP中,其实aspx文件和aspx.cs都被混成了一个类,那么这个所谓的PageController和View(aspx页面)是耦合起来的。

反过来看java的MVC,在jsp2.0规范中,不允许直接请求jsp页面而是需要通过Servlet来重定向,具体的效果先不说,起码倒是把Controller和View分开了,而且也统一了入口,都是从控制器进入的,那么控制器的职责也就很清晰了:

  1. 拦截http请求
  2. 将请求转换成要执行的具体业务逻辑的操作
  3. 判断调用业务操作还是委托给处理程序
  4. 帮组用户选择要显示给客户端的下一个视图
  5. 将视图返回给客户端

如果按照ASP.NET的WebForm来实现的话,那么4,5两步就很让人迷惑了,因为Controller和视图已经牢牢的绑定在了一起,如何选择,如果将请求转发,那么应该也将请求转发给了下一个控制器而不是视图。

所以微软用一个MVP来忽悠了之后,大家反而迷惑了。所以新人注意了,如果你开始学WebForm就千万不要看MVC,否则也会被忽悠。

至于微软新出的MVC,没用过,不做评论。

这里我总结一下我的观点,什么样的框架算是MVC呢?

首先,M、V、C三部分的功能应该符合

Model,负责业务领域状态的知识

View,负责业务领域的表示视图

Controller,负责控制用户输入的流和状态

由于Web下的限制,Controller应该作为整个请求的入口,由Controller来组织业务逻辑(判断请求和业务逻辑的对应关系,最终的实现还是Model),而模型的改变通知视图的功能也就应该由Controller来转达一次(没办法,Web的限制,由于Controller被作为了入口,那么模型通知视图变化的事件也之只能由Controller来触发,或者也可以是Controller通知视图模型变化了,然后视图到模型去取数据)。

其实从上面的分析看来,起码来说视图应该能够根据模型自己组织输出的外观而不必假手Controller,但是在ASP.NET中实际的操作看来,模型都是通过控制器在绑定数据。

之前很早就看过Henry Fan兄的Nclay,其中的MVC组件给出的例子还没好生研究,所以在这里也期待Henry兄给出自己的宝贵意见

posted on 2007-10-19 18:15 亚历山大同志 阅读(6130) 评论(28)  编辑 收藏 网摘

评论

#1楼  2007-10-19 18:35 偶卖糕的      

不是非要mvc,而是webform在web开发上面缺陷太多,没办法呀。   回复  引用  查看    

#2楼  2007-10-19 19:06 asboy      

终于知道什么是MVC了 哈哈   回复  引用  查看    

#3楼  2007-10-19 20:48 怪怪      

MVP不是你说的那样. 最早MVP是IBM在96年提出的, 不过比MS的MVP还大一些, 有点类似于一个小框架指导了..

另外其实对于Web, 现在广泛流行的这种InputController式的被动MVC根本不是出路, 什么时候使用还得仔细衡量~   回复  引用  查看    

#4楼  2007-10-19 20:55 怪怪      

@偶卖糕的
其实不如说, WebForm式的框架如果要实现好, 需要考虑的细节太多, 而微软也没做好...   回复  引用  查看    

#5楼  2007-10-19 21:15 浮云      

看MonoRail的界面和程序的分离,确实对美工和程序员分工有很大帮助,多了解一种方案总还是好的。   回复  引用  查看    

#6楼  2007-10-20 10:37 Klesh Wong      

楼主说李宇春有吸引力这点有点难以接受啊,把MVP跟李宇春等同起来就更加令人无法接受了。

@怪怪
在目前HTTP协议的限制下,实现纯粹MVC根本就不可能的。又何必如此执着于概念?最起码这种被动的MVC用起来比WebForm舒服。   回复  引用  查看    

#7楼  2007-10-20 10:47 随风流月      

我都不用这种四不象的玩意儿。
自己手写 XHTML,hoho~   回复  引用  查看    

#8楼  2007-10-20 10:52 Klesh Wong      

@随风流月
手写XHTML跟 MonoRail和WebForm 没有关系,不在一个讨论层次。   回复  引用  查看    

#9楼 [楼主] 2007-10-20 11:14 亚历山大同志      

@Klesh Wong
澄清,偶不系玉米,偶系凉粉   回复  引用  查看    

#10楼  2007-10-20 13:35 MYOOP      

讨论这些有什么用。
微软弄什么你还不是跟着学什么,不喜欢就用java。   回复  引用  查看    

#11楼  2007-10-20 15:44 aspnetx      

MVC概念的提出,多少标志着微软真正的向企业级应用市场进发,是个好消息,大可不必彷徨失措.现在事务没有一成不变的,适应变化才是我们应该有的一个趋势.理智的看待类似的问题吧.   回复  引用  查看    

#12楼  2007-10-21 01:16 红茶TT      

monorail没有aspx文件啊   回复  引用  查看    

#13楼  2007-10-21 02:56 镜涛      

呵呵,听楼主这么一说还真觉得是这样,Java的Servlet确实可以作为控制器,而Asp.Net的codebehind只是在形式上把表现和控制分开而已。不过java需要在web页中写java代码,形式就不太好了。   回复  引用  查看    

#14楼  2007-10-21 13:47 xiaogang      

看完以后,明白了一些自己以前不懂的东西。   回复  引用  查看    

#15楼  2007-10-22 07:26 怪怪      

@Klesh Wong
我没有执着于什么呀. WebForm有WebForm的问题, MVC有MVC的问题, 猜测你是做企业项目的, 所以对Web项目的复杂性感受不深. 其实不是WebForm, 恰恰是MVC对Http模型的看法在一些领域的应用内有致命的问题. WebForm只是做的不够干净利落, 别别扭扭很不好使罢了.

@aspnetx
这种小事上升到拥抱还是拒绝变化就有点小题大作了, 毕竟这些知识早就普及了, 微软怎么变也影响不了几个合格的开发者, 拿我来说除了松一口气, 别的什么感觉也没有. 为什么会反而轻松了呢? 因为微软除了炒剩饭, 没拿出什么夺咱们饭碗的东西 :).

只是微软最近的一些行为反而说明它被大家搞迷糊了, 大家不知道自己想要什么, 只知道比较已有的; 而微软呢, 就干脆什么都来一脚, 看看是不是东边不亮西边亮, 这可不是行业领袖的风范... 不过可能微软的文化就是如此, 没有革命性的创新不要紧, 只要做好应该做的, 照样无往不利~

只喜欢和关注微软的那些跟硬件有关的项目, 倒都是蛮有新意的, 而且在未来会给咱们开发者带来新的挑战. 比如Surface的多点触摸吧, 有几个人设计过类似几个鼠标一块用的操作界面? iPhone的Multi-Touch也一样, 虽然比微软更早的应用到实际产品, 我估计在OSX上肯定也没有一个完整的模型, 都是些特别编制的程序. 这样其实除了给大家培养一下未来的操作模式的概念当个革命先烈, 顺便Jobs再当次明星, 对Apple没有什更大好处.

最值得担心的其实的是W3C的各种标准推荐尤其是Script方面的, 现在还再搞那些没实际意义的, 如果再拿不出一个针对多点设备响应的模型, 将来又是各干各的, 搞Web界面编程的可惨了, 说不准W3C的专家们又都得各回各家等老妈们决战出胜利者再出来玩了~~

我觉得程序员的眼光应该更多的放在不久的未来应用会是什么样上面, 这是保住饭碗, 提高收入的唯一途经, 至于到底哪种实现方式合理, 哪种适合某一种应用, 就在这种应用上合理..   回复  引用  查看    

#16楼  2007-10-22 10:26 Clark Zheng      

在微软忽悠的MVP中,其实aspx文件和aspx.cs都被混成了一个类,那么这个所谓的PageController和View(aspx页面)是耦合起来的。

-------------------------------

据我所知,MVP框架里是把Presenter(博主所说的PageController)单独提出来在Business Module中进行开发,其通过Aspx.cs中实现的IView接口通知View层进行表现,而Aspx.cs通过[Create New]时获得的Presenter实例进行后台的调用。

Aspx和Aspx.cs本身都是View层的,就是混在一起的一个类,在开发表现为后台独立是为了方便编程而己。   回复  引用  查看    

#17楼  2007-10-22 10:57 Klesh Wong      

@怪怪
兄台好像不太喜欢认真地阅读他人的文章哦……
http://www.cnblogs.com/Klesh/archive/2007/10/13/webform-and-monorail.html
兄台还批评过我的这篇post呢
企业项目复不复杂我是不太清楚,但网站开发鄙人倒是做过几年。正是基于对网站开发复杂度的切身感受,才认为界面和程序需要切割,才认为WebForm的控件式开发不适合用来做网站开发。   回复  引用  查看    

#18楼  2007-10-22 17:40 Cure      

smarttalk???
还是smalltalk???   回复  引用  查看    

#19楼  2007-10-22 21:53 works guo      

很热烈哦。。,我也来,,我感觉微软应该是从用户需要去设想的,不同的人有不同的需要,不管java是怎样的,至少微软的平台上没有MVC的!我赞成“怪怪”的看法,需要关注未来和什么是你需要的就好啦   回复  引用  查看    

#20楼  2007-10-23 00:55 怪怪      

@Klesh Wong
抱歉哈, 我是看大家的文章看到眼花, 所以有经常记混... :) 另外不要总说我批评了, 其实如果我留言了, 就说明我跟大家学会了很多, 其它的则是博主们引出的思考, 要是人人都给我扣帽子, 我成了公敌了快..

其实分歧估计在于, 大多数反对WebForm的人眼中的WebForm的控件式开发和我眼中的其实不是一回事, 对HTML的看法和用法估计都不是完全相同. 界面和程序当然需要切割, 但是控件式的概念在一些时候也是行之有效的, 至于何时兼顾两者, 就是具体问题具体分析了.

MVC的问题我考虑过一阵子了, 现在这种形式的MVC, 确实在一定程度上解决了HTML界面和程序的分离问题, 但是形式固定而死板, 其实有很多问题和天花板存在..   回复  引用  查看    

#21楼  2007-10-23 10:51 Klesh Wong      

@怪怪
哈哈,兄台误会了,批评对我来讲并非坏事,也不是在指责你。你讲得对我还是很乐意接受的,可是兄台在指出错误用法的同时也要提出一下正确的用法嘛,不然像我就会觉得很郁闷了。
斧正斧正,有斧有正——   回复  引用  查看    

#22楼  2007-10-24 21:05 Irons(阿铁)      

是否现在的标准已经成为一种局限了呢?
该弄出另外一些web协议?颠覆下传统.   回复  引用  查看    

#23楼  2007-10-30 12:32 henry      

今天才看到这文章,首先我写的NClay的目的不是在MVC上,我只是想VIEW和Business列好的隔离出来.相信楼主清楚在aspx.cs(PageController)堆满逻辑所带来的恶果.无论是webform或MonoRail也好,如果开发员本身意识不到位都会出现这情况.MonoRail并没有规定M的业务处理部分不能直接在action controller里实现.
为了达到开发员必须分离编写代码,所以nclay实现通过接口来进行约束VIEW和Business的关系,这种约束是强制性的没有留给开发人员说不的余地.
其实webform和MonoRail只是其view和controller关系存在关别,服务器件由于是代码输出描述所以VIEW和controller偶合过高而已(这一点ASP.NET 2.0已经有了些进步了).   回复  引用  查看    

#24楼  2007-12-21 13:14 蛙蛙池塘      

阅过   回复  引用  查看    

#25楼  2008-02-22 17:30 MS的明天      

谢谢博主的这篇文章,说道了一些实质的东西,感悟很深   回复  引用  查看    

#26楼  2008-07-01 14:50 逆水行船      

前几天看《深入浅出MFC》中了解到,MVC,M是数据,V是数据的表现形式,C是控制。
一个数据可能有多种表现方式,例如预览,编辑,打印。
同样的M可以通过不能的需要,经由C,显示不同的V。



对MVC在B/S中的应用我自己很混乱,有时候觉得自己明白,有时候又觉得自己没有明白,而且ASP.NET中还有页面回传,弄得我不知道什么时候用MVC。
有那么一个感觉,好像MVC解耦了商业逻辑层与页面表现层,使这两部分都比较独立。

  回复  引用  查看    

#27楼  2008-07-01 15:50 逆水行船      

我有一段时间认为:
url只是一个对业务的请求,
页面只是对业务的表现,
HttpContext只是一个装东西的容器,
业务请求中提出了对业务的要求,商业逻辑给出了答复,并将需要的东西装载HttpContext中,至于怎样表现,那就是别人的事了【C的事了】。
所以实现与表现的关系就不大了。

这是我那段时间的理解。   回复  引用  查看    

#28楼  2008-08-04 11:36 光龙      

ms.mvc与asp.net到底有什么区别,我现在的这个项目用的是monorail,不知以后转用mvc容易不,他们又有什么区别了,请高手赐教   回复  引用  查看    

导航

公告

鉴于很多TX投诉黑色背景杀伤眼球,遂换个容易阅读的
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

与我联系

搜索

 

常用链接

留言簿(29)

我参加的小组

我的标签

随笔分类(84)

随笔档案(83)

相册

朋友的Blog

同事的Blog

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜

60天内阅读排行