zoukankan      html  css  js  c++  java
  • 顶着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,竟然都出来了,然后继续测试增删改的方法,一路绿灯,全过了,太简单了,实在是强大!!!

  • 相关阅读:
    数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案
    数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量
    docker的入门简介
    nginx方向代理详解及配置
    nginx配置文件详解
    nginx安装
    iptables防火墙
    服务器加载过程
    服务器
    操作系统
  • 原文地址:https://www.cnblogs.com/netcasewqs/p/556891.html
Copyright © 2011-2022 走看看