前言
ASP.NET MVC作为微软官方的.NET平台下MVC解决方案,自诞生起就吸引了众多.NET平台开发人员的眼球。在经历了漫长Preview后,上个月微软终于发布了其beta版。应该说,通过我亲身实践,我认为这个框架的设计还是相当优秀的,至少从易用性来说,ASP.NET MVC要优于Java平台上的Struts和Struts2。使用Struts实现MVC时,除了要写一堆ActionForm、Action和ActionResult外,最头疼的莫过写于各种xml映射配置文件。Struts2虽然不用再写ActionForm,并且降低了侵入度(其实Struts2和Struts关系不大,而基本可以认为是WebWork的后续版本),但是仍无法避免xml配置文件。
ASP.NET MVC从一开始的设计思路就与Struts不同,它的映射是利用路由配置而非xml,从而大大降低了开发复杂度,并且比Struts要更直观,更容易上手。
可是,这并不表明ASP.NET MVC就是尽善尽美的。在我实践的过程中,发现某些地方使用起来还是不太方便,在这里小小论述一下。不妥之处,还请各位尽情批评。
别扭的视图:能不能不要让我承担逻辑
我个人认为,ASP.NET MVC第一个不太妥当的地方就是视图的实现。在这个框架中,视图是使用ASPX文件实现的。就呈现数据这一需求来说,ASP.NET MVC下一般性的做法是:控制器负责调用Model完成数据的读取,并将需要呈现的数据通过ViewData传递给视图,并选择某视图呈现。被选中的视图要负责将ViewData中相应的数据读取、分解,然后使用一定的逻辑语句将其呈现。
这个方式,就要求视图中存在一定的逻辑语句,如将ViewData中数据转换成相应类型的类型转换语句;如果需要按照某一条件呈现不同内容,则需要分支语句;而常用的表格式数据呈现需要用到循环语句。于是,我们就会看到视图中充斥着各种<%%>、if、foreach等等的东西。
当然,我不否认,良好的编写可以让这些代码整洁的出现在视图中。然而,在我的心目中,一个良好基于Web应用的MVC框架设计,其视图是不应该存在任何可执行代码的,而应该是一个单纯的模板文件,或者说含有可替换标签的页面文件,就像PHP平台下的Smarty那样。至于视图中相应的可替换标签替换成什么内容,应该是控制器的责任。设计一套良好的标签模板,对数据、分支、循环等常见任务设置相应标签,我认为是更适合ASP.NET MVC的视图设计。一来,这样可以让视图真正“静态化”,更有利于逻辑和表示的分离;二来,美工可以更好的关注于仅包含html代码和标签的视图,而不用关注于可执行代码。
对Ajax的支持:仍然很不方便
我们知道,现在在一个Web应用中加入Ajax元素是司空见惯的,微软当然知道这一点,所以在ASP.NET MVC中,天然支持ASP.NET AJAX和jQuery,并提供了一个AjaxHelper来完成一些辅助性操作。然而,这个AjaxHelper的功能真是远远不够。
由于ASP.NET MVC的特性,导致某一个Action的Url不是固定的。所以在请求Action时,一般不是将Url硬编码在页面中,而是通过Html.ActionLink动态生成。这就出现了一个问题,Ajax请求怎么办?当然,对于点击链接或提交表单触发的Action,AjaxHelper有专门的辅助方法,但是,如果某个Ajax请求不是通过链接或表单触发的,就会很有问题。毕竟你不能把Url硬编码在js里。
关于这个问题,没有太好的解决方案,目前只能用一些类似hack的方式。如将Url用Html.ActionLink写入某个span,再将这个span的display设为none。最后,js从span中读入Url进行请求。
希望在后续版本中,ASP.NET MVC能对Ajax有更好的支持。
文档
再一个我认为ASP.NET MVC不太理想的地方就是没有完整的配套文档。目前能找到的官方文档只有Quick Start,并没有完整的开发文档。也许是因为正式版还没有发布吧,希望配套文档能尽快推出。
后面的话
虽然有以上诸多不便,但是ASP.NET MVC作为一个正在发展的框架,我个人还是很看好其前景的。希望它能越来越完善,给ASP.NET平台上的MVC开发带来更多的便利。
posted @ 2008-12-04 11:11
EricZhang(T2噬菌体) 阅读(3328)
评论(49) 编辑 收藏 网摘 所属分类:
心得体会
发表评论
没有那种方案可以解决不在表现层包含逻辑的问题,无论是webform还是mvc都没有彻底解决这个问题,相对来说MVC解决的好点。
1、route部分如果不用XML来配置的话,你程序部署后你想改route规则就比较麻烦了,前几天我还介绍了一篇文章是说在ASP.NET MVC中实现用XML来配置route规则的
2、视图里面的类型转换,对于强类型语言这是无可厚非的,肯定没有Python的Django框架那样灵活。至于<%%>、if、foreach这些也是肯定必须的,只是WebForm写这些非常不灵活,比较烦,MVCContrib里面的几个模板引擎相对来说写起模板来代码就干净多了,只是都不成熟,比较多bug。我也希望M$能为MVC重新证一个模板引擎。
3、form的ajax嘛,你完全可以写一个普通的form,然后用jQuery来接管form的submit方法,url根本不用写到一个隐藏的span中那么麻烦。
4、文档确实是不齐全。
#5楼[
楼主]2008-12-04 12:31 |
@Q.Lee.lulu
刚拜读了你的“使用XML文件来动态配置ASP.NET MVC的Route规则”,受益匪浅
--引用--------------------------------------------------
kiler: 没有那种方案可以解决不在表现层包含逻辑的问题,无论是webform还是mvc都没有彻底解决这个问题,相对来说MVC解决的好点。
--------------------------------------------------------
表现逻辑可以并且应该放在视图里
单就易用性来说,ASP.NET MVC 当然要好过Structs, 但在其他方面,MS的这个框架就目前来说要逊色的多,多了去了。不知道LZ有没有用这个两个框架做过实际开发?
#8楼[
楼主]2008-12-04 12:41 |
@hook
都做过实际项目
其实,微软的这个MVC,真的很让人失望,其进度也很不符合微软的风格,都搞了那么久了,搞半天经常放鸽子,现在才是beta版本并且问题多多,比如如何在现在的MVC下实现多语言支持?这些貌似还没有很好的解决方案。而Structs天生就支持这些,那些标签,模板,这些MS还都没有;甚至我觉得其易用性还不如PHP的Zend.
我猜测微软之所以进度缓慢,估计有两个原因:
1.要考虑应用服务器的兼容。
2.要考虑与原有Asp.net控件模型的兼容,估计还要考虑IDE的兼容。
我甚至都觉得,微软应该单出一个IDE插件来开发MVC模型的ASP.NET应用。
从去年,就开始关注这个了,这个东西放在微软就这么难吗?
我如果有需要我就输出一个javascript代码var actionlink=...不过还是觉得不是很爽。
用jQuery直接接管form的工作,再来Replace也可以,但是这样交互的是文档,通常文档比较大,对性能没提升(显得有点像UpdatePanel了,虽然很方便,但是应用有限)。
如果要符合“Ajax的精髓”以数据为交互的中心,就的确得考虑在客户端获取ActionLink的问题了。
视图中的类型转换我觉得这是无可厚非的,而且似乎也不会造成视图多“难看”。老赵的WebCast里也提到过关于视图的问题,坚持“视图中只出现表现逻辑”这一点,是开发视图的一个大原则。比如就不应该在视图中去访问数据等等,本来Controller和Model交互的就是数据,不是内容,怎么显示当然由视图逻辑去确定,那视图中有逻辑不是理所应当了?
--引用--------------------------------------------------
hook: 其实,微软的这个MVC,真的很让人失望,其进度也很不符合微软的风格,都搞了那么久了,搞半天经常放鸽子,现在才是beta版本并且问题多多,比如如何在现在的MVC下实现多语言支持?这些貌似还没有很好的解决方案。而Structs天生就支持这些,那些标签,模板,这些MS还都没有;甚至我觉得其易用性还不如PHP的Zend.
我猜测微软之所以进度缓慢,估计有两个原因:
1.要考虑应用服务器的兼容。
2.要考虑与原有Asp.net控件模型的兼容,估计还要考虑IDE的兼容。
我甚至都觉得,微软应该单出一个IDE插件来开发MVC模型的ASP.NET应用。
从去年,就开始关注这个了,这个东西放在微软就这么难吗?
--------------------------------------------------------
不敢恭维
1、ASP.NET MVC不是不可以运行在IIS6下,而且一样可以做到无后缀名的URL。当然,性能会有所损失。
2、为什么要兼容ASP.NET的控件模型?首先请允许我武断地判断你说的是ASP.NET WebForm的控件模型,既然ASP.NET MVC和ASP.NET WebForm本来就是两个不同的思路,为什么要兼容?IDE的话,既然ASP.NET MVC本来就着眼于部署在.NET Framework 3.5的环境下,为什么要完全兼容Visual Studio 2005呢?本来就不是一代的产品。
@JimLiu
同意,兼容ASP.NET的控件模型是个很sb的做法,完全没有必要。
关于楼主说得视图中使用标签的问题,我有些疑问:
如果使用标签模板来呈现,那么,假如控制器执行相应的业务逻辑后,经处理模板标签后,呈现出视图,这时候,我们可能要更新页面的某一部分,执行这样的操作肯定也要由控制器来处理,这时候就只能使用模板重新生成整个视图了,实际上,我们只需要更新一小部分内容,这时候处理起来会不会很麻烦?
我不大懂ASP.NET MVC,随便说的哈
@JimLiu
支持10楼,兼容ASP.NET的控件模型和MVC可以说没有任何关联,在MVC中的View上可以不用任何的ASP.NET的控件。
很赞同视图的观点,满屏的<%%>真的是很恶心,现在的项目进行了2个星期,我就快受不了了。
ajaxhelp都没有去用,感觉太鸡肋。
#15楼[
楼主]2008-12-04 13:42 |
@上不了岸的鱼{ttzhang}
我也觉得是这么回事,但是有时必须兼容,如母版功能,实现母版就是靠服务器端控件。可是兼容了又觉得……反正很矛盾的感觉
@T2噬菌体
服务端控件也得一分为二地看,有的服务端控件不需要在runat="server"的form里的,那种控件可以很好地用在MVC中,没有runat="server"只是少了一些依赖PostBack对控件编程的功能。但这不正是MVC和WebForm的两个思路吗?
@JimLiu
不知道你有没有仔细看过MVC生成的那些配置节点,如果不考虑兼容性,它需要这么费劲吗?
即使是这样,你在IIS6.0上部署,也要设置映射吧,并且在最初的版本里,要在IIS6.0中部署成功也很麻烦的。
IIS7.0当然要好的多,但微软显然知道,现在还是IIS6.0的天下。
至于我说的,要与ASP.NET控件模型兼容,我说的不是很清楚,我的意思是,即使在2008中开发也很不方便,你不觉得吗?
他要考虑你使用同一个IDE,开发MVC,和 基于ASP.NET控件模型的应用程序,比如说你做一个VIEW的时候,照道理来说,就不应该
出现那么多服务器控件在工具箱里,而是应该出现很多mvc特有的渲染标签。但现在它是这样的吗?
@hook
为啥MVC要特殊的IDE呢?如果一个视图引擎可以让你很方便的在DW中进行视图的设计或者只是一个简单文本编辑器,那么这个视图引擎才是一个好的视图引擎,因为它关注的只是数据的显示,不应该有啥复杂的东西。
另:啥是渲染标签?
我的亲身感受是一个熟练使用webform的人比起熟练使用asp.net mvc
的人或许开发速度上会高出不少,我刚开始用asp.net mvc时有点天真的
认为会提高我的工作效率,结果虽然我开发的很顺利,没有遇到卡壳的地方
,可是开发的速度却下降了不少。
关于View的东西太较真了,foreach/for之类的循环根本也可以不视为编程语句,而是一种DSL标记。Controller负责的就是数据的输出,而不是数据的格式化,如果要Controller对应模板的“每个动态数据细节”这就是滥用职责的表现了而且事实上也只有编程语句(至少是类编程语句) + Helper方法才能真正保证客户端的灵活性和强大性,在这点上就算所谓“RoR”也不能避免。
至于楼上的“特殊IDE”也不敢苟同,当然如果您说要建立在非WebForm的ViewEngine基础上,这就是另一回事。
IIS 6,IIS 7……更别提了,根本没有兼容的问题。性能?好吧我承认理论上会“相对”略低一些,但是你的动态应用程序能够让这个性能问题成为瓶颈也算无敌了。
--引用--------------------------------------------------
木野狐(Neil Chen): web 里的 mvc 怎么看怎么别扭。
--------------------------------------------------------
我的经验是,别太想MVC“模式”和“框架的关系”,总之就是三块,该怎么做就做什么。
@brightwang
以前要是没做asp开发的话,你怎么也不会习惯mvc的,mvc适合那种对html有超强控制欲望的人。
@Jeffrey Zhao
老赵有啥好的ViewEngine介绍没?这几天看了下Brail好像挺不错,只是很不完善...
@brightwang
开发速度慢应该算是正常吧 ?
--引用--------------------------------------------------
Q.Lee.lulu: @Jeffrey Zhao
老赵有啥好的ViewEngine介绍没?这几天看了下Brail好像挺不错,只是很不完善...
--------------------------------------------------------
其实我很喜欢WebForms作为ViewEngine
--引用--------------------------------------------------
kiler: @brightwang
以前要是没做asp开发的话,你怎么也不会习惯mvc的,mvc适合那种对html有超强控制欲望的人。
--------------------------------------------------------
其实是看项目,不过其实WebForm也可以控制,很多控件是不污染页面的。而且最多像ASP.NET MVC那样写法。
@Q.Lee.lulu
Promesh.net的视图引擎不知道适不适合楼主。和Nvelocity类似。
@Q.Lee.lulu
看人,用的惯就快,用的不惯就慢。
关注了好久,个人很看好,只是感觉感觉对JS,HTML的技术要求太高了。。努力中
要把一个ProductId和ProductName转换为一个超链接,这再无可厚非不过了吧,这就是“视图逻辑”,或者说是“表现逻辑”,这种逻辑不出现在View出现在哪呢?或者说View中出现视图逻辑又问题吗?我喜欢用aspx,ascx,master这套ViewEngine的原因是因为可以用C#来完成视图逻辑,加上有Helper可以帮忙,我可以很轻易的完成视图逻辑,而不是其他一种我不甚了解的语法生疏的ViewEngine。
@hook
关于你说的IDE的问题,我不明白,因为我的控件面板都是设置成自动隐藏的。而且本来就有那些方便的Helper了,通过Helper可以完成几乎所有的视图逻辑,实在不行可以自己扩展一些辅助方法放在CodeBehind中,反正目前我是这样做的,没遇到什么问题。我没弄明白你所说的“渲染标签”是什么意思。
“然而,在我的心目中,一个良好基于Web应用的MVC框架设计,其视图是不应该存在任何可执行代码的,而应该是一个单纯的模板文件,或者说含有可替换标签的页面文件,就像PHP平台下的Smarty那样。”
我觉得这应该一分为二地看待,一方面是灵活性,如果能在视图中嵌入逻辑无疑对更好的控制生成的HTML是有帮助的。
如果不愿意嵌入逻辑,做成完完全全的模板形式,我相信以后会出现XSLT的视图引擎——但是我觉得视图永远不可能完全没有逻辑。
@JimLiu
@Jeffrey Zhao
同意以上观点.
在view中没有逻辑是不可能的,例如用户没登录的时候显示个登录框,这肯定得有个判断的逻辑,你用任何模板都必须的.但是有些视图引擎写起来就比较简洁、好看,例如Brail的:
<ul><%for element in list: output "<li>${element}</li>"%></ul>
<% output AdminMenu(user) if user.IsAdministrator %>
但是如果用WebFrom来写我老觉得页面有点乱....
--引用--------------------------------------------------
Q.Lee.lulu: @JimLiu
@Jeffrey Zhao
同意以上观点.
在view中没有逻辑是不可能的,例如用户没登录的时候显示个登录框,这肯定得有个判断的逻辑,你用任何模板都必须的.但是有些视图引擎写起来就比较简洁、好看,例如Brail的:
<ul><%for element in list: output "<li>${element}</li>"%></ul>
<% output AdminMenu(user) if user.IsAdministrator %>
但是如果用WebFrom来写我老觉得页面有点乱....
--------------------------------------------------------
如果一个页面既是新建(save)又是更新(update)用,那view将是非常难看的,判断将会很多。我现在采取和以前做webform一样的方法,
就是在.cs页面里写方法做些页面显示的逻辑,然后html页面将值传给。cs
页面的方法进行判断,可以减少<%if%>的数量。使页面更简洁些。
什么都好,就TM的aspx 里的< "" 内所有提示感知无效.....
很明显,关于AJAX请求,Html.ActionLink肯定是不对的
MVC提供了Url辅助类,LZ没注意到?
#39楼[
楼主]2008-12-04 22:33 |
@CNS
如果不是通过链接或表单进行ajax请求,AjaxHelper无能为力
@brightwang
赞成把一些判断性语句写在CodeBehind中,CodeBehind是一个很好的Helper,但是不赞成把foreach这种语句写在CodeBehind,而应该写在aspx中,因为这是控制文档结构。
@Q.Lee.lulu
这个东西说白了就是个人喜好,webform一样的可以写的很优雅,看你怎么写而已。
--引用--------------------------------------------------
kiler: @brightwang
以前要是没做asp开发的话,你怎么也不会习惯mvc的,mvc适合那种对html有超强控制欲望的人。
--------------------------------------------------------
我就是那种对html有超强控制欲望的人,嘿嘿
--引用--------------------------------------------------
Jeffrey Zhao: 关于View的东西太较真了,foreach/for之类的循环根本也可以不视为编程语句,而是一种DSL标记。Controller负责的就是数据的输出,而不是数据的格式化,如果要Controller对应模板的“每个动态数据细节”这就是滥用职责的表现了而且事实上也只有编程语句(至少是类编程语句) + Helper方法才能真正保证客户端的灵活性和强大性,在这点上就算所谓“RoR”也不能避免。
--------------------------------------------------------
非常同意老赵的观点,用过struts的模板标签,其原理就是if else,foreach这些逻辑,虽然说封装了一层,但是意义并不是很大。
--引用--------------------------------------------------
Jeffrey Zhao: --引用--------------------------------------------------
Q.Lee.lulu: @Jeffrey Zhao
老赵有啥好的ViewEngine介绍没?这几天看了下Brail好像挺不错,只是很不完善...
--------------------------------------------------------
其实我很喜欢WebForms作为ViewEngine
--------------------------------------------------------
同意
我没怎么玩过ASP.NET MVC,不过我觉得它跟Rails非常相似,只是Rails发展了那么久已经比较成熟,ASP.NET MVC很多东西还没能学过来,或者说在选择学还是不学。
例如说Ajax的问题,Rails有解决方案,Nikhil个人的做法也是把Rails的方案搬到ASP.NET MVC中,但官方的版本还是没有完全抄Rails的做法,这证明Microsoft内部仍未对这个问题该怎么解决有所定论。
#47楼[
楼主]2008-12-06 23:35 |
@Cat Chen
呵呵,目前只能静观其变了。不过微软说正式版和beta不是有很大差别
@Cat Chen
Ajax整合我也觉得很不爽,AjaxHelper比较鸡肋,jQuery实现虽然轻巧难度也低但是总不是原生的,整合起来总觉得有层隔膜,不过毕竟还是Beta,正式版也许会有一个比较妥当的解决方案。
虽然说ASP.NET MVC跟RoR比的确难免有模仿嫌疑,但是不得不说ASP.NET MVC还是很不错的,有其独到之处,而且在我看来,向优秀的东西靠拢也是正确的,毕竟技术总得进步。
#49楼[
楼主]
2008-12-07 10:51 |
@JimLiu
我赞同你的观点