顶着Rails的浪潮,用NDO + Castle的monorail 也来秀一把
Rails 技术自从2004年7月出来后,在整个IT业界引起了巨大的震动,现在的JAVA 开源领域也RAILS了,.Net 在Castle项目下也Rails了,Castle下的monorail已经IRC了。我对rails技术非常看好,但是看到monorail的模型层用的是Castle 的ActiveRecord ,就开始对monorail有了些许抵触的思想情节,继续往下看,看到模板有3个选择,第一NVelocity,第二Aspx,第三是Brail,当时我对Velocity/NVelocity已经很熟了,但是对NVelocity 有抵触(因为NVelocity 的作者已经说过了以后不会在更新NVelocity了,NVelocity 还有不少Bug呢,为了使用NVelocity 我就把NVelocity的Bug修改了4/5处),aspx的引擎支持的非常弱,Brail的视图引擎用的是Boo语言,又不熟悉,当时对monorail有一点不是特别看好。昨天在博客园上看到了一个兄台说Castle IRC Release1.0了,我怀着好奇心从官方网站上下载了monorail进行安装。首先看看版本,确实 Release1.0,再看看NVelocity 的版本,非常惊奇升级了,从0.42升级到0.5了,然后把以前的版本的NVelocity换成新的,测试通过了----无缝兼容,太棒了!马上进行实验,因为我对Castle 的ActiveRecord 的性能和BUG之多和偏见就用NDO来代替了。
1:首先在VS2003下根据Monorail的插件向导新建一个monorail的项目NW,该向导已经自动给你生成整个系统框架了,包含dll的引用,系统的配置,以及控制器和视图目录等!太方便了,节约了我很多配置的时间了,哈哈!
2:添加NDO组件引用,在项目中建一个"Models"的文件夹,用NDO工具生成一个强类型的活动记录
{
构造函数
属性
}
3: 在"Controllers"的文件夹中添加一个RegionController类,让这个类继承自SmartDispatcherController,添加布局Layout(asp.net 中的master page)和异常处理的配置如
[Layout("default"), Rescue("generalerror")]
public class NRegionController:SmartDispatcherController
{
}
4: 在RegionController类中导入模型层的包,并且增加New,Create,Delete,Edit,Update,List几个空的Action方法
5:在"Views"的目录下新增一个Region的目录(对应控制器RegionController),然后在Region 目录下新增new.vm,edit.vm,list.vm(视图的名称必须和Action方法名保持一致,这是Rails框架的约定--"约定胜于配置")三个页面
6: 开始正式编码了,首先完成控制器代码,代码如下,非常简单
public void Create([DataBind("rg")] Region model)
{
try
{
model.Save();
}
catch(Exception ex)
{
this.Flash["error"] = "Could not save Region. " + ex.Message;
}
this.RedirectToAction("list");
}
public void Delete(int id)
{
try
{
Region rg = new Region();
rg.Delete(id);
}
catch(Exception ex)
{
this.Flash["error"] = "Could not Delete Region For ID =. " + id.ToString() + ex.Message;
}
}
public void Edit(int id)
{
try
{
Region rg = new Region();
rg.LoadByKey(id);
this.PropertyBag["rg"] =rg;
}
catch(Exception ex)
{
this.Flash["error"] = "Could not Load Region. " + ex.Message;
}
}
public void Update([DataBind("rg")] Region model)
{
try
{
model.Update();
}
catch(Exception ex)
{
this.Flash["error"] = "Could not save Region. " + ex.Message;
}
this.RedirectToAction("list");
}
public void List()
{
try
{
this.PropertyBag["rows"] = new Region().Find();
}
catch(Exception ex)
{
this.Flash["error"] = "Could not List Region. " + ex.Message;
}
}
7:写视图
list.vm代码:
<p>
<p>
Create a New Region $htmlHelper.LinkTo("New","new")
</p>
<table width="100%" border="1" cellpadding="2" cellspacing="0">
<tr>
<th>ID</td>
<th>Description</td>
<th></td>
</tr>
#foreach($row in $rows)
<tr>
<td align=center>$row.RegionID</td>
<td align=center>$row.RegionDescription</td>
<td align=center>
$htmlHelper.LinkTo("Edit","region","edit",$row.RegionID) |
$htmlHelper.LinkTo("Delete","region","delete",$row.RegionID)
</td>
</tr>
#end
</table>
new.vm 里面包含了验证框架的一个简单测试
$ValidationHelper.InstallScripts()
$ValidationHelper.SetSubmitOptions(false, false, true, 5)
<form action="create.rails" method="post" onsubmit="$ValidationHelper.GetValidationTriggerFunction()">
<p>
ID: $FormHelper.TextField("rg.RegionID")
</p>
<p>
Desc: <input type=text name="rg.RegionDescription" validators="blank"/>
</p>
<p>
<input type="submit" value="Create" />
</p>
</form>
edit.vm 比较简单(没有包含验证)
<form action="update.rails" method="post">
<p>
ID: $FormHelper.TextFieldValue("rg.ID",$rg.ID)
</p>
<p>
Desc: $FormHelper.TextFieldValue("rg.RegionDescription",$rg.RegionDescription)
</p>
<hr/>
<p>
<input type="submit" value="Update" />
</p>
</form>
最后是一个Layout 的模板页default.vm
"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html>
<head>
<title>Layout</title>
<style type="text/css" media="screen">
body
{
background-color: white;
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: small;
}
</style>
</head>
<body>
你好同志!<br/>
#if($Flash.error)
<p style="color: red; font-weight: bold;">
$Flash.error </br>
</p>
#end
#if($Flash.sucess)
<div style="backcolor: yellow; font-weight: bold;">
$Flash.sucess </br>
</div>
#end
$childContent
</body>
</html>
8: 最后把NW的项目发布到IIS下(默认的Monorail项目都是类库项目,必须手工发布),并且在iis下添加一个对".rails"的ISAPI扩展的配置
9:在IE下输入http://localhost/nw/region/list.rails,竟然都出来了,然后继续测试增删改的方法,一路绿灯,全过了,太简单了,实在是强大!!!