Mono提供很多组件可以方便的处理页面:可以自动将后台的值填充到页面,可以自动进行Javascript验证,可以自动在后台验证等。这些功能都是比较实用的,可以减少很多开发
FormHelper是用来对应html页面中Form内的tag的,可以自动填充textbox等 
ValidationHelper可以帮助我们在前台利用Javascript验证
Castle.Components.Validator组件可以在后台对页面输入值进行验证
一、自动填充页面
普通填充:
HomeController:

        public void Fill1()
        {
            PropertyBag.Add("id", "1");
            PropertyBag.Add("name", "GSpring");
            PropertyBag.Add("sex", "1");
        }

Fill1.vm:

<form >
id:$FormHelper.TextField("id")<br />
name:$FormHelper.TextField("name")<br />
sex
 male:$FormHelper.RadioField("sex", "1")
 female:$FormHelper.RadioField("sex", "0")
</form>

当我们执行http://****/home/Fill1.rails时会自动将对应的值绑定到页面中去,页面结果为:

我这里只是实验了常用的textbox和radiobutton,其他的也是同样处理的
高级填充:

public void Index()
{
    PropertyBag.Add("list", new string[] 
    {
        "value 1", "value 2"
    } );

    PropertyBag.Add("contacts", new Contact[] 
    { 
        new Contact("john", "address 1", "phone number 1"),
        new Contact("mary", "address 2", "phone number 2")
    } );
}

Vm代码:

<form action="Save.rails" method="post">

$FormHelper.TextField("list[0]")
$FormHelper.TextField("list[1]")

$FormHelper.TextField("contacts[0].name")
$FormHelper.TextField("contacts[0].address")
$FormHelper.TextField("contacts[0].phone")

$FormHelper.TextField("contacts[1].name")
$FormHelper.TextField("contacts[1].address")
$FormHelper.TextField("contacts[1].phone")
</form>

可以自动将对象、数组中对应的值填充到页面上去

二、前台验证
1、 只能输入数字的限制
只需要在Vm中写:
$FormHelper.InstallScripts()
$FormHelper.NumberField("age")
$FormHelper.NumberField("amount", "%{exceptions='32',forbid='48,49'}")
第一句是注册脚本,第二句是生成一个textbox,并且只能输入数字
第三句是生成一个textbox,并且只能输入数字,同时可以输入code=32的字符,同时不能输入code=48或49的字符
2、ValidationHelper验证
功能很强大,我这里只是列出一些简单的使用,使用这种方式时几乎不需要后台代码,只需要在vm文件中定义就可以了:

<html>
    <head>
        <title>Validation Test</title>
        $ValidationHelper.InstallScripts()
        $ValidationHelper.SetSubmitOptions(true, true, false, 0)
    </head>
    <body>
        <form method="post" id="demoForm" onsubmit="$ValidationHelper.GetValidationTriggerFunction()">
                    姓名:<input type="text" name="Name" id="Name" displayName="姓名" validators="blank" /><br />
                    密码:<input type="password" name="Password" id="Password" validators="length|6" /><br />
                    邮件:<input type="text" name="Email" id="Email" validators="email|3" /><br />
                    确认邮件:<input type="text" name="Email_Confirm" id="Email_Confirm" validators="equalto|Email" /><br />
                <input type="submit" name="Submit" value="测试" />
        </form>
    </body>
</html>

开始的$ValidationHelper.InstallScripts()和$ValidationHelper.SetSubmitOptions(true, true, false, 0)两句话是注册脚本的,不能少
然后主要就是validators属性设置的值了,比如:blank(不能为空)、length|6(六位长度)、email(邮件类型)等
在这个例子中,当什么也不输,直接点测试时,会弹出一个对话框报错:Please enter 姓名
这里显示的都是英文的报错信息,如果需要使用中文报错,可以使用以下方法:
(由于目前MonoRail没有提供简体中文的报错,需要我们自己生成)
复制MonoRail\Castle.MonoRail.Framework\Controllers目录下的ValidationLang.resx文件,改名为ValidationLang.zh-cn.resx,然后将此文件中对应的英文提示改为中文,比如:

            fvalidate.i18n =
            {
                //    Validation errors
                errors:
                {
                    blank:        [
                        ["请输入:", 0]
                        ],

将框架项目重新编译
然后将vm中的第四条语句改成:
$ValidationHelper.InstallScripts("zh-cn")
这样当再次照上面的步骤执行时会弹出一个对话框报错:请输入:姓名

三、Castle.Components.Validator后台验证使用
ValidatorController.cs代码:

    public class User
    {
        private int id;
        private string name, email, password, confirmation;

        public User()
        {
        }
        public User(string name, string email)
        {
            this.name = name;
            this.email = email;
        }

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        [ValidateNonEmpty]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        [ValidateNonEmpty, ValidateEmail]
        public string Email
        {
            get { return email; }
            set { email = value; }
        }

        [ValidateNonEmpty]
        public string Password
        {
            get { return password; }
            set { password = value; }
        }

        [ValidateSameAs("Password")]
        public string Confirmation
        {
            get { return confirmation; }
            set { confirmation = value; }
        }
    }

    public class ValidatorController : SmartDispatcherController
    {
        public ValidatorController()
        {
        }

        public void Index()
        {
        }
        public void Test([DataBind("user", Validate = true)] User user)
        {
            if (HasValidationError(user))
            {
                Flash["user"] = user;
                Flash["summary"] = GetErrorSummary(user);
                RedirectToReferrer();
            }
            else
            {
                //其他操作
                CancelView();
            }
        }
    }

最主要的就是User中每个字段上定义的属性,比如ValidateNonEmpty(不能为空)、ValidateEmail(邮件格式)、ValidateSameAs(判断是否相同)、ValidateLeng(长度判断)、ValidateDate(日期判断)等

index.vm:

<html>
<body>
$FormHelper.FormTag("%{action='Test', immediate='true', useLabels='true'}")

#if($summary)
<p>
    <div>
    发生以下错误:
    </div>
    #foreach($propName in $summary.InvalidProperties)
    $propName: #foreach($msg in $summary.GetErrorsForProperty($propName)) $msg #end <br/>
    #end
</p>
#end
    姓名:$FormHelper.TextField("user.name")<br />
    邮件:$FormHelper.TextField("user.email")<br />
    密码:$FormHelper.PasswordField("user.password")<br />
    确认密码:$Form.PasswordField("user.confirmation")<br />
<input type="submit" value="确认" />
$FormHelper.EndFormTag()
</body>
</html>

当浏览 http://localhost:***/validator/index.rails 在什么也不输的情况下直接点确认,会报错:

这样,我们几乎一句检查的代码都没写,就可以达到检查的效果了
当然,默认的报错信息是英文的,我们可以修改如下定义:

        [ValidateNonEmpty("不能为空", FriendlyName="姓名")]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

那么在姓名列没输入时会报错:姓名: 不能为空

其实User类的定义就相当于一张表的Model,在Monorail中把Model定义好,就可以达到验证的功能了

本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2007/10/31/944282.html,如需转载请自行联系原作者

MonoRail学习笔记十一:页面控件的填充和验证相关推荐

  1. vs2010 学习Silverlight学习笔记(7):控件样式与模板

    概要: 终于知道Silverlight--App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版...好强大的功能啊. 封装: 继续学习<一步一步学Silverl ...

  2. JavaFX 学习笔记——窗口与控件

    前言 如今比较流行的桌面gui框架有WPF.WinForm.Qt.javafx等.其中WPF和WinForm目前还只能在运行Winsows上.Qt(widget)是一个很强大的跨平台C++框架(不只是 ...

  3. vb.net listview 删除选定行_VBA学习笔记59-1: listview控件

    学习资源:<Excel VBA从入门到进阶>第59集 by兰色幻想 本节学习Listview控件,它可以用多种视图方式显示项目的控件.由于其外形美观而且非常实用,所以使用频率很高. Lis ...

  4. kendo treeview 修改节点显示值_VBA学习笔记60-1: Treeview控件

    学习资源:<Excel VBA从入门到进阶>第60集 by兰色幻想 本节讲Treeview控件. TreeView控件是以树形结构显示数据的控件.利用TreeView控件,可以设计出树形结 ...

  5. ASP.NET 学习笔记_01 广告控件的使用

    广告控件的使用: 广告文件是一个XML文件,广告文件中所有的标签属性被分析后放到adProperties字典中,用以属性编辑. ads.xml 1 <?xml version="1.0 ...

  6. Qt学习笔记之常用控件QlistWidget

    一.QListWidget Class The QListWidget class provides an item-based list widget. More... Header: #inclu ...

  7. Android开发学习笔记-自定义组合控件

    为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...

  8. LVGL v8学习笔记 | 06 - label控件的使用方法

    文章目录 一.label控件 1. 创建label对象 2. 设置label的文本 3. 获取label文本 4. label的大小 5. label的样式 6. label的事件 二.label控件 ...

  9. 【MFC】学习笔记:常用控件之组合框(Combo Box)

    01.目录 目录 01.目录 02.控件介绍 03.控件的消息通知函数 04.创建组合框控件及成员函数介绍 4.1 组合框的创建 4.2 CComboBox类的主要成员函数 05.应用实例 06.总结 ...

最新文章

  1. 《javascript语言精粹》读书笔记(一)
  2. python可以做什么项目-Python可以做大项目吗?
  3. tableau可视化数据分析60讲(八)-tableau计算函数(重点知识)
  4. JS 搜索 --下拉列表
  5. try、catch、finally 和 throw-C#异常处理
  6. 【2018.4.7】模拟赛之三-ssl2384 字符串【字符串】
  7. kafka不使用自带zk_kafka概念扫盲
  8. 以前看书时记得一些笔记(二),很早了,现在再看都有些看不懂了
  9. 从源码角度分析android事件分发处理机制
  10. 苹果照片库的照片,直接拖到桌面上
  11. NOPI导出excel
  12. 【unity 】第一人称角色控制器手机虚拟双摇杆
  13. git reset,rebase,amend 使用实战
  14. 路由器、DDNS、花生壳
  15. 强化学习——格子游戏问题
  16. 全面反攻,不给割肉者任何机会
  17. NSDate 农历节日
  18. 图片上传实时预览效果
  19. PAT A1010 Radix
  20. 基于计算机视觉的手势识别技术

热门文章

  1. python[进阶] 6.使用一等函数实现设计模式
  2. 钮扣电池电压电量_纽扣厂
  3. 碎片时间学习前端,我推荐这些~
  4. 防止html标签转义
  5. 第十一篇:(顺序)容器的好伴侣 --- 容器适配器
  6. 记录最近的一些遇到的前端面试题
  7. cxGrid 在 GridMode = True 模式下实现标题点击排序以及标题列过滤筛选!!!
  8. 【原创】erlang 模块之 application
  9. MySQL--3--mysqldump备份策略
  10. X-Scan描述及简单教程