wsky's blog,Record my technical life

just coding

导航

MVC&MonoRail 从webform到模板引擎

首先,引用一段话,园子里的某人如是说:
"不要把asp.net和webform混淆,邪恶的是webform。拖一个textbox和写<input type=“textbox”/>比起来能省多少事?如果要做个有个性化样式或结构的表格,用控件能比foreach容易?从datagrid的编辑模式更新一列数据要多少步骤?获得行索引,获得行,从中再获得控件,再赋值。如果用mvc的话,input的值直接就能从action的参数获得了。在熟悉html的前提下,webform毫无优势"

接着,给你介绍一下Rails
继续引用:
Rails框架首次提出是在2004年7月,它的研发者是26岁的丹麦人David Heinemeier Hansson。不同于已有复杂的Web 开发框架,Rails是一个更符合实际需要而且更高效的Web开发框架。Rails结合了PHP体系的优点(快速开发)和Java体系的优点(程序规整),因此,Rails在其提出后不长的时间里就受到了业内广泛的关注。
Rails框架主要有如下的6大特点。
1.全栈式的MVC框架
2.约定优于配置
3.更少的代码
4.生成器
5.零周转时间
6.支架系统
Rails的支架系统可以自动为任何相关的数据库表创建一套包含标准CRUD操作和前台视图的系统。通过支架系统,开发人员可以方便快捷地操纵数据库中的数据表。此外,Rails也允许开发人员使用自己设计的代码或视图来替换自动生成的代码和视图。

关于Rails可以参考这里:http://www.cnblogs.com/wsky/articles/1149317.html



然后回到本文的主题上,开源是自由的,rails的自由度和开发效率现在已经毋庸置疑了,
      "拖一个textbox和写<input type=“textbox”/>比起来能省多少事?",你觉得呢?的确,五花八门的Server Control是似乎是asp.net最吸引人, 最有优势的地方. Webform确实是一个非常棒的设计. 复杂的HTML和js在服务端被包装成简单易用, 有清晰层次结构的对象, 比起asp时代界面的编写方便多了.
然而大部分流行的asp.net控件, 都有开源的js实现的替代品, 例如HTML编辑器可以用FCKeditor, 日历可以用JsCalendar, 还有TreeView, Menu之类的, 在sf.net都应该找得到比较好的项目. 其实webform只是入门容易,要精通的话它的成本是比精通xhtml + css + javascript的成本高得多的。

再来看看微软新推出的MVC,
ASP.NET MVC还会使用aspx,但是它没有viewstate,没有postback,所以它在这里只是个模板引擎;
现在要进入关键的地方了,
何谓模板引擎?
还是要再提到前面介绍的Rails,先说Ruby on Rails,对于完全动态的语言,你是否了解呢?(额~我也不大了解,所以这里就不说他...),
再看看Monorail(原名Castle On Rails,是CastleProject的一个子项目),
到处都是On Rails,快捷开发~!
下面开始介绍Monorail,我感兴趣的东西^^
以下是引用^^

MonoRail的核心是Action Pack在.NET上的实现. 这种方式高效, 直观而且易于测试.
MonoRail的开发模式和传统的webform有很大区别, webform属于PageController模式, 每一个页面对应一个Controller, 通常情况下, 这个Controller就是根据url相对应的.aspx文件分析出来产生的类. 如果不清楚aspx的底细, 请看这里. System.WebUI.Page实现了IHttpHandler, 每个aspx相关的类各自处理自己的http请求, 经一些逻辑处理后(通常代码在aspx的Codebind类, 也就是aspx的父类), 输出自己的视图. 而MonoRail是FrontController模式, 由Castle.MonoRail.Framework.MonoRailHttpHandler接管所有请求, 然后根据请求的url创建相应的controller, controller再调用相应的action, 最后调用模板引擎输出内容. 默认情况下, 一个url的结构是Controller/action. 例如, http://localhost/monorailSample/Home/index.rails对应类HomeController的Index()方法.

MonoRail实现的模板引擎有3个
AspNetViewEngine
用传统的.aspx文件做模板, 可以照常使用aspx语法和服务器控件, 但是由于Webform的生命周期和MonoRail完全不同, 有时候会让人觉得别扭, 有部分特性也受到了限制.

NVelocityViewEngine
用NVelocity做模板引擎, 需要学习
VTL语法, 但是使用很简单, 特别是很多java程序员已经熟悉velocity. 简单的语法也强迫程序员把逻辑和界面很好的分离开来, 方便跟美工配合.
BrailViewEngine
基于
Boo的模板引擎, Boo是一种语法类似python的.NET语言, 据MonoRail的参考说, Brail引擎是功能最强, 性能最好的选择, 但Boo是一种陌生的语言, 这成了Brail引擎应用的最大障碍.
综合各种因素, MonoRail推荐使用的模板引擎是NVelocity

这是官方网的链接,想深入了解的可以看看^^欢迎交流
http://www.castleproject.org/monorail/index.html



看了上面那么多没有头绪的东西,问你一个问题,asp.net可以实现MVC吗?CodeBehind是不是MVC的表现形式呢?
^-^犹豫了?我敲段代码给你瞧瞧
string output=GetStringFromStream(Server.Excute("XX.aspx")).Replace("$name","Carl Xu");
Respone.Write(output);

//xx.asp
<div>$name</div>
.....

看出这是在做什么了么,是不是很熟悉呢?写过N遍了?是的,我在替换模板,在实现一个超简单的模板引擎(姑且这么说),
那么,我为什么不用webform控件绑定呢?我的回答是:"用绑定?用控件?还是用<%#%>?,我要有N个类似的页面呢?我还是要反复的这样绑定?我的美工怎么办??他要什么时候才能参与到项目里来?他的页面到底怎么编写?",
这个问题出现的原因是什么呢?
答案是,我们需要MVC,我们需要真正的分离.显然asp.net webform的模板方式不能满足这种分离,CodeBehinde不过是控制的转移,从asp到asp.net的一个飞跃而已...


我们来看看Monorail是怎么做的,
/////////////////////
//~/Controllers/xx.cs
using System;
using Castle.MonoRail.Framework;

namespace MonoRailTest.Controllers
{
    public class HomeController :Controller
    {     
        public void Index()
        {
            PropertyBag.Add("name", "John Doe");
        }
    }
}
//////////////////////
//~/views/xx.vm
<html>
  <body>
    Hi there, my name is $name!  </body>
</html>

看到了吗?你说说看,View和Controller分离了没?

还有视图状态和回发吗?传统的aspx生命周期不见了...

这里要说明一点,使用Monorail意味着不能使用传统的asp.net,aspx页面对你来说毫无意义;
我们的页面是xxx.rails,Monorail框架代替了asp.net的模板引擎,当然,在服务器级别还是需要经过asp.net ISAPI筛选,
然后才将控制权交给Mono,



说了这么多 就是因为突然觉得MVC能那么的临近(离自己思想近,^^),有感而发~~
现在还有MVP(基于控件)也是一个趋势,总之,web开发,开发效率和性能是最终话题,框架和模式是
为达到这些目的而生,一个框架并不难掌握,思想才是关键,也许你在深入了解一些框架之后会发现,原来自己也曾在实践
编写一个自己常用的小框架(仅仅是很小的一点应用),


话题就到这,微软的技术更新太快了,对于像我这样刚学习不久的人员来说,实在是汗,大汗,呵呵 加油吧,
别被微软惯坏了^^



整理一些Monorail的链接
http://www.castleproject.org/monorail/index.html
http://www.cnblogs.com/Yok/category/106196.html
http://goodlyts.cnblogs.com/archive/2005/10/19/257542.html
http://www.cnblogs.com/bluewater/archive/2006/12/11/589214.html
http://terrylee.cnblogs.com/archive/2006/05/07/393481.html

感谢乐于分享的人们^_^

posted on 2008-04-12 03:00  wsky  阅读(903)  评论(0编辑  收藏  举报