MonoRail学习笔记七:页面交互的输入输出方式总结

 

MonoRail和WebForm很大的一个区别就是没有使用viewstate,不能使用WebForm中的服务器控件。
所以页面的取值、赋值都要由我们自己控制,当然MonoRail也提供了很多种页面交互的方式
这篇笔记主要考虑页面之间的传取值,对于Application、Session、Cookie等不做讨论

下面列出我看到的一些方式,有遗漏的地方,欢迎补充。
注:对于中文可能乱码的情况:
1、需要把如下的nvelocity.properties文件放入views/ 下:
    input.encoding=GB2312
    output.encoding=GB2312

2、在web.config中指定中文编码:
  <globalization requestEncoding="GB2312" responseEncoding="GB2312"/>

取值方式:

测试Html文件

1、 最原始的Request方式:

         public   void  Index()
        
{
            
string id = Request.Form.Get("id");
            
string name = Request.Form.Get("name");
            
string age = Request.Form.Get("age");
            
string birthday = Request.Form.Get("birthday");
        }


2、 智能绑定方式
我们的controller需要从SmartDispatcherController继承:
    public class ServletController : SmartDispatcherController
然后就可以直接定义方法:

         public   void  Index( int  id,  string  name,  int  age, DateTime birthday)
        
{
        }

 

就会自动将值作为参数绑定

另外,如果我们有如下的一个类:

     public   class  User1
    
{
        
private int _id;
        
public int Id
        
{
            
get return _id; }
            
set { _id = value; }
        }


        
private string _name;

        
public string Name
        
{
            
get return _name; }
            
set { _name = value; }
        }

    
        
private int _age;

        
public int Age
        
{
            
get return _age; }
            
set { _age = value; }
        }


        
private DateTime _birthday;

        
public DateTime Birthday
        
{
            
get return _birthday; }
            
set { _birthday = value; }
        }

    }

在绑定时可以直接绑定到这个类上面去:

         public   void  Index([DataBind( " user " )]User1 user)
        
{
        }

同时开始时的测试html也要做修改:

< html >
< head >
    
< title > 测试页面 </ title >
</ head >
< body >
< form  action ="/index.rails"  method ="post"   >
    ID:
< input  type ="text"  name ="user.id"  value ="1" />< br  />
    姓名:
< input  type ="text"  name ="user.name"  value ="姓名" />< br  />
    年龄:
< input  type ="text"  name ="user.age"  value ="22" />< br  />
    生日:
< input  type ="text"  name ="user.birthday"  value ="2007-1-1" />< br  />
    
< input  id ="Submit1"  type ="submit"  value ="submit"   />
</ form >
</ body >
</ html >

加了一个前缀user.
另外User1类中的属性名是不区分大小写的,还有当输入的日期格式不合法时,会赋默认值0001-1-1

3、Params方式

             string  aa  =  Params[ " id " ];
            
string  aa  =  Params[ " name " ];

Params属性中不光保存有页面的值,还有Http头信息的,比如Params["REMOTE_HOST"]就可以取得远程主机的名称

将值传入页面
1、直接使用Request对象
使用Request对象可以直接取得上一个页面输入的值,在vm中显示
vm中:
    $Request.Form.Get("birthday")

2、使用Flash对象
Flash对象的使用和下面的PropertyBag对象基本相同
最大的一个区别就是Flash对象是把值暂存到一个请求中的,在下一个请求中可以获得,参见如下代码:

         public   void  Index()
        
{
            PropertyBag.Add(
"test2""G");
            Flash.Add(
"test""Spring");

            RedirectToAction(
"Flash1");
        }


        
public   void  Flash1()
        
{
            RenderView(
"display");
        }

也就是把值分别放入PropertyBag和Flash中后跳转到下一个action

display.vm中:
    $test<br />
    $test2<br />

页面显示时能正确显示test的值,test2值取不到
也就是说Flash对象可以保存比如出错信息等,在下一个页面中显示

3、普通的PropertyBag方式

            PropertyBag.Add( " name " " 姓名 " );
            PropertyBag.Add(
" List " new  String[]  "1""2""3" } );

vm中:

    姓名:$name < br  />
    #foreach ($element in $list)
        $element
< br  />
    #end

可以传入一些标准对象,对象和数组

4、使用PropertyBag将自定义对象传入页面
    PropertyBag.Add("user", user);
vm中:
    姓名:$user.name<br />
对于复合情况,比如ArrayList中保存User对象的情况也很方便:

            ArrayList list  =   new  ArrayList();
            list.Add(user);
            PropertyBag.Add(
" list " , list);

vm中:

    #foreach ($element in $list)
        $element.name
< br  />
    #end


5、使用Helpers对象
对于需要在vm中调用类方法的情况,比如ServletController类中有如下方法需要在vm中被调用:

         public   string  Welcome( string  str)
        
{
            
return "Welcome :" + str;
        }

 


Index方法:

         public   void  Index([DataBind( " user " )]User1 user)
        
{
            ArrayList list 
= new ArrayList();
            list.Add(user);
            PropertyBag.Add(
"list", list);
            Helpers.Add(
"Welcome"new ServletController()); 
        }

主要是要把对象放入Helpers对象中去
vm中:

    #foreach ($element in $list)
        $Welcome.Welcome($element.name)
< br  />
    #end


另外如果这个方法在很多action中都要调用到,我们可以加入如下的类属性:

    [Helper( typeof (ServletController),  " Welcome " )]
    
public   class  ServletController : SmartDispatcherController

如果这个方法不光是这个controller中用到,我们还可以定义一个包含此属性的父类,其他需要用到的地方直接从这个父类继承,那么在vm中就可以直接使用了

另,MonoRail也提供了一些标准的Helpers:

            AbstractHelper[] builtInHelpers  =
                
new  AbstractHelper[]
                    
{
                        
new AjaxHelper(), new BehaviourHelper(),
                        
new UrlHelper(), new TextHelper(), 
                        
new EffectsFatHelper(), new ScriptaculousHelper(), 
                        
new DateFormatHelper(), new HtmlHelper(),
                        
new ValidationHelper(), new DictHelper(),
                        
new PaginationHelper(), new FormHelper(),
                        
new ZebdaHelper()
                    }
;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值