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工具生成一个强类型的活动记录

None.gif public   class  Region:ActiveRecord
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
ContractedSubBlock.gifExpandedSubBlockStart.gif        
构造函数#region 构造函数
InBlock.gif        
public Region()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
属性#region 属性
InBlock.gif        
public int RegionID
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{  
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn (int)this["RegionID"]; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gifthis["RegionID"= value; }
ExpandedSubBlockEnd.gif        }

InBlock.gif        
public string RegionDescription
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{  
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn (string)this["RegionDescription"]; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gifthis["RegionDescription"= value; }
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif        
InBlock.gif        
ExpandedBlockEnd.gif    }


         3:   在"Controllers"的文件夹中添加一个RegionController类,让这个类继承自SmartDispatcherController,添加布局Layout(asp.net 中的master page)和异常处理的配置如

None.gif   using  Castle.MonoRail.Framework;
None.gif [Layout(
" default " ), Rescue( " generalerror " )]
None.gif 
public   class  NRegionController:SmartDispatcherController
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif {
ExpandedBlockEnd.gif }

 

         
None.gif

      4:    在RegionController类中导入模型层的包,并且增加New,Create,Delete,Edit,Update,List几个空的Action方法
      5:在"Views"的目录下新增一个Region的目录(对应控制器RegionController),然后在Region 目录下新增new.vm,edit.vm,list.vm(视图的名称必须和Action方法名保持一致,这是Rails框架的约定--"约定胜于配置")三个页面
      6:   开始正式编码了,首先完成控制器代码,代码如下,非常简单

ExpandedBlockStart.gif ContractedBlock.gif public   void  New() dot.gif {}
None.gif
None.gif        
public   void  Create([DataBind( " rg " )] Region model)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                model.Save();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch(Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.Flash["error"= "Could not save Region. " + ex.Message;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
this.RedirectToAction("list");
ExpandedBlockEnd.gif        }

None.gif
None.gif        
public   void  Delete( int  id)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Region rg 
= new Region();
InBlock.gif                rg.Delete(id);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch(Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.Flash["error"= "Could not Delete Region For ID =. " + id.ToString() + ex.Message;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
None.gif        
public   void  Edit( int  id)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Region rg 
= new Region();
InBlock.gif                rg.LoadByKey(id);
InBlock.gif                
this.PropertyBag["rg"=rg;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch(Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.Flash["error"= "Could not Load Region. " + ex.Message;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
None.gif        
public   void  Update([DataBind( " rg " )] Region model)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                model.Update();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch(Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.Flash["error"= "Could not save Region. " + ex.Message;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
this.RedirectToAction("list");
ExpandedBlockEnd.gif        }

None.gif
None.gif        
public   void  List()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.PropertyBag["rows"= new Region().Find();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch(Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.Flash["error"= "Could not List Region. " + ex.Message;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif

7:写视图
      list.vm代码:

None.gif Region List:
None.gif
< p >
None.gif
< p >
None.gifCreate a New Region $htmlHelper.LinkTo("New","new")
None.gif
</ p >
None.gif
< table  width ="100%"  border ="1"  cellpadding ="2"  cellspacing ="0" >
None.gif    
< tr >
None.gif        
< th > ID </ td >
None.gif        
< th > Description </ td >
None.gif        
< th ></ td >
None.gif    
</ tr >
None.gif    #foreach($row in $rows)
None.gif    
< tr >
None.gif        
< td  align =center>$row.RegionID</td>
None.gif        
<td align =center>$row.RegionDescription</td>
None.gif        
<td align =center>
None.gif            
$htmlHelper.LinkTo("Edit","region","edit",$row.RegionID) |
None.gif            $htmlHelper.LinkTo("Delete","region","delete",$row.RegionID)
None.gif        </td
>
None.gif    
</ tr >
None.gif    #end
None.gif
</ table >

   new.vm 里面包含了验证框架的一个简单测试

None.gif < h3 > New Region </ h3 >
None.gif
None.gif$ValidationHelper.InstallScripts()
None.gif$ValidationHelper.SetSubmitOptions(false, false, true, 5)
None.gif
None.gif
< form  action ="create.rails"  method ="post"  onsubmit ="$ValidationHelper.GetValidationTriggerFunction()" >
None.gif
None.gif    
None.gif        
< p >
None.gif        ID: $FormHelper.TextField("rg.RegionID")
None.gif        
</ p >
None.gif
None.gif        
< p >
None.gif        Desc: 
< input  type =text  name ="rg.RegionDescription"  validators ="blank" />
None.gif        
</ p >
None.gif
None.gif    
< p >
None.gif    
< input  type ="submit"  value ="Create"   />
None.gif    
</ p >
None.gif
None.gif
</ form >

edit.vm 比较简单(没有包含验证)

None.gif < h3 > Edit Product </ h3 >
None.gif
None.gif
< form  action ="update.rails"  method ="post" >
None.gif
None.gif    
< p >
None.gif    ID: $FormHelper.TextFieldValue("rg.ID",$rg.ID)
None.gif    
</ p >
None.gif
None.gif    
< p >
None.gif    Desc: $FormHelper.TextFieldValue("rg.RegionDescription",$rg.RegionDescription)
None.gif    
</ p >
None.gif
None.gif    
< hr />
None.gif
None.gif    
< p >
None.gif    
< input  type ="submit"  value ="Update"   />
None.gif    
</ p >
None.gif
None.gif
</ form >
None.gif

   最后是一个Layout 的模板页default.vm

None.gif <! DOCTYPE html PUBLIC 
None.gif  "-//W3C//DTD XHTML 1.0 Strict//EN"
None.gif  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
>
None.gif
< html  xmlns ="http://www.w3.org/1999/xhtml" >
None.gif
< html >
None.gif    
< head >
None.gif        
< title > Layout </ title >
None.gif        
< style  type ="text/css"  media ="screen" >
None.gifbody
None.gif{
None.gif    background-color: white;
None.gif    font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
None.gif    font-size: small;
None.gif}        
None.gif        
</ style >
None.gif    
</ head >
None.gif    
< body >
None.gif你好同志!
< br />
None.gif
None.gif#if($Flash.error)
None.gif
< style ="color: red; font-weight: bold;" >
None.gif    $Flash.error 
</ br >
None.gif
</ p >
None.gif#end
None.gif
None.gif#if($Flash.sucess)
None.gif
< div  style ="backcolor: yellow; font-weight: bold;" >
None.gif    $Flash.sucess 
</ br >
None.gif
</ div >
None.gif#end
None.gif$childContent    
None.gif    
None.gif    
</ body >
None.gif
</ html >
None.gif

8: 最后把NW的项目发布到IIS下(默认的Monorail项目都是类库项目,必须手工发布),并且在iis下添加一个对".rails"的ISAPI扩展的配置
9:在IE下输入http://localhost/nw/region/list.rails,竟然都出来了,然后继续测试增删改的方法,一路绿灯,全过了,太简单了,实在是强大!!!

转载于:https://www.cnblogs.com/netcasewqs/archive/2006/11/10/556891.html

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐