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

public class Region:ActiveRecord
    
{
        
构造函数

        
属性
        
        
    }


         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)
<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,竟然都出来了,然后继续测试增删改的方法,一路绿灯,全过了,太简单了,实在是强大!!!

posted @ 2006-11-10 18:18  风云  阅读(3068)  评论(13编辑  收藏  举报