用MonoRails做过一个项目,感觉MVC模式思路比较清晰,最近听说微软官方出了MVC,就下载了一份,是第二个预览版,还包含一份源码。恰好最近又有一个小项目,想尝试使用ASP.NET MVC来做,因为MR已经很久不更新了,从SVN上下来的代码老是有问题(可能是自己的问题),觉得还是用官方的好一些,况且微软还开放了源码,只是不允许自由发布,于是就学习和测试了一下,对测试中遇到的问题摘录如下,也许并不是问题,只是和MonoRails对比学习过程中的一些感觉。
一、好的感觉
1、整体感觉和MR类似,目录结构,控制器类的规则,视图目录规则等基本一致。
2、视图的可编程性增强。MR的视图(NVelocity)编程能力较差,也是MVC的哲学思想决定的,而ASP.NET的MVC视图默认是ASPX格式的,编程能力肯定是没得说了,C#和类库均可用,确实方便了许多,但要控制烂用,大量的东西写在视图中,感觉就不好了,但对于开发来说,确实方便了许多。
3、可以在视图中使用部分服务器控件,还可以绑定数据。偶而用一下未尝不可,和上一条类似,自己控制不要烂用,否则用WebForm好了。
4、可以用Linq查询数据库和建立模型,对数据库的操作更直接一些了。
5、视图文件的编写支持语法高亮和代码自动提示完成,爽多了。不知是不是我的版本有问题,偶而会失灵。我可是下的官方90天试用版。
6、完整的IDE支持,新建项目,新建控制器、视图都有模板可用,MR的IDE支持不好。
二、差的感觉
1、视图aspx文件带差两个无用的附属文件.cs和.designer.cs,感觉很不好,目录中的文件很乱,是WebForm的遗留。
2、Web.config文件中内容太多、太复杂,搞不懂都配置了些什么,容易出问题,好在是项目模板帮助配置好的,但要自己修改恐怕很难搞清楚。
3、没有文档,资料少,网上就那么几篇文章,转来转去,很多写法和语法还是第一个预览版的,在第二版中已经不能用了。
4、HtmlHelper太差了,比MR的完善程度要差很多,自己感觉MR的FormHelper很完美,基本上没有bug,用起来也很简单,但ASP.NET的HtmlHelper每一个都有很多的重载,参数搞得很复杂,有的重载之间还有冲突,特别是有一些很怪异的写法一时很让人摸不着头脑。
比如:Html.Select,我们需要设置的项目一般包括,文本字段和值字段,这两个是必需的。写法如下:
这个输出有几个问题:
1、而输出时是把textField的值输出成select 的value属性,而valueField的内容输出成select的text属性,不知是我理解的有问题,还是参数命名问题,觉得很别扭。
2、最后一个参数objValue,有两种重载形式,一种为object,另一种为IEnumerable类型,用来设定select标签的当前选定值。如果直接在这里写上对象的属性,而这个属性是字符串类型,就会出错,需要写成(object)objValue才能正常运行。很迷惑,不知是我哪里搞得不对,看了一下微软提供的源码,好象确实要这么写才行。有点搞不懂。
3、其中有一个重载形式可以输出htmlAttributes,从而设置输出标签的格式、onclick事件等,是一个字典,以前用MR都是用这种方式来输出,感觉很方便,但在这里这个属的字典要求是RouteValueDictionary类型或Dictionary<string, object>类型,也就是值必需是object,如果用Dictionary<string, string>就会出错。
4、多种重载形式华而不实啊,个人感觉只要有上面的基本形式,最后再加上一个htmlAttributes就OK了。
5、强类型的视图写起来真是麻烦啊,哪一个类型错了都不行,感觉还不如MR的傻傻的视图感觉好。
上面主要是写的视图(V)及helper的感觉,控制器(C)和MR非常类似,过滤器比MR的要好,MR的过滤器是类过滤器只能应用到控制器上,而ASP.NET MVC的过滤器是方法过滤器,控制器过滤是事件,写起来会更简洁一些。模型(M)原来是用ActiveRecord,现在是Linq,没有太大可比性,Linq的工具支持要比ActiveRecod上一个等级,也更灵活,哲学观点不一样,不可类比。没有测试Linq的数据库视图更新功能,这个也很重要,ActiveRecord中使用的方法是设定模型中哪些字段不更新和插入,这样生成的SQL中只包括一个表的字段,视图自然就可以更新了。
UrlRotue在MR中没怎么用,感觉用起来太麻烦了。而ASP.NET MVC是以UrlRotue为基础的,是一等公民,不仅仅是看起来好看,更重要的是可重构,以URL暴露整个应用中可提供的服务是一种理念上的变化。由于原来没用过这个东东,所以还需要深入研究和学习。不过,微软一贯重视兼容性,这个也不例外,在mvc项目中即使不使用UrlRotue,也不影响开发和应用,特别是当一些rotue规则不匹配时,会自动生成原生格式的url,这个很不错,降低了入门门槛。
总的感觉,这个版本基本可以达到实用的程度了,有些不完善的地方,只要小心地绕过,应该可以正常在项目中使用。但从第一版到第二版变化挺大的,估计第三版到beta版,再到正式版还会有较大的变化,会给项目的维护和升级带来一定的工作量。