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"/>
取值方式:
2、 智能绑定方式
我们的controller需要从SmartDispatcherController继承:
public class ServletController : SmartDispatcherController
然后就可以直接定义方法:
另外,如果我们有如下的一个类:
另外User1类中的属性名是不区分大小写的,还有当输入的日期格式不合法时,会赋默认值0001-1-1
3、Params方式
将值传入页面
1、直接使用Request对象
使用Request对象可以直接取得上一个页面输入的值,在vm中显示
vm中:
$Request.Form.Get("birthday")
2、使用Flash对象
Flash对象的使用和下面的PropertyBag对象基本相同
最大的一个区别就是Flash对象是把值暂存到一个请求中的,在下一个请求中可以获得,参见如下代码:
display.vm中:
$test<br />
$test2<br />
页面显示时能正确显示test的值,test2值取不到
也就是说Flash对象可以保存比如出错信息等,在下一个页面中显示
3、普通的PropertyBag方式
4、使用PropertyBag将自定义对象传入页面
PropertyBag.Add("user", user);
vm中:
姓名:$user.name<br />
对于复合情况,比如ArrayList中保存User对象的情况也很方便:
5、使用Helpers对象
对于需要在vm中调用类方法的情况,比如ServletController类中有如下方法需要在vm中被调用:
Index方法:
vm中:
另外如果这个方法在很多action中都要调用到,我们可以加入如下的类属性:
另,MonoRail也提供了一些标准的Helpers: