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工具生成一个强类型的活动记录
public
class
Region:ActiveRecord
{
构造函数#region 构造函数
public Region()
{
}
#endregion
属性#region 属性
public int RegionID
{
get { return (int)this["RegionID"]; }
set { this["RegionID"] = value; }
}
public string RegionDescription
{
get { return (string)this["RegionDescription"]; }
set { this["RegionDescription"] = value; }
}
#endregion
}
3: 在"Controllers"的文件夹中添加一个RegionController类,让这个类继承自SmartDispatcherController,添加布局Layout(asp.net 中的master page)和异常处理的配置如
using
Castle.MonoRail.Framework;
[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
New()
{}
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代码:
Region List:
<
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 里面包含了验证框架的一个简单测试
<
h3
>
New Region
</
h3
>
$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 比较简单(没有包含验证)
<
h3
>
Edit Product
</
h3
>
<
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
<!
DOCTYPE html PUBLIC
"-//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,竟然都出来了,然后继续测试增删改的方法,一路绿灯,全过了,太简单了,实在是强大!!!