MonoRail和WebForm很大的一个区别就是没有使用viewstate,不能使用WebForm中的服务器控件。
所以页面的取值、赋值都要由我们自己控制,当然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文件
<html>
<head>
<title>测试页面</title>
</head>
<body>
<form action="/index.rails" method="post">
ID:<input type="text" name="id" /><br />
姓名:<input type="text" name="name" /><br />
年龄:<input type="text" name="age" /><br />
生日:<input type="text" name="birthday" /><br />
<input id="Submit1" type="submit" value="submit" />
</form>
</body>
</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()
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?