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工具生成一个强类型的活动记录
{
构造函数#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)和异常处理的配置如
[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,竟然都出来了,然后继续测试增删改的方法,一路绿灯,全过了,太简单了,实在是强大!!!
所有评论(0)