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

简介:
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,如需转载请自行联系原作者

相关文章
|
3月前
|
前端开发
前端基础(十四)_隐藏元素的方法
本文介绍了几种在前端开发中隐藏元素的方法,包括使用`display:none`、`visibility:hidden`、`opacity:0`等CSS属性,并提供了相应的示例代码。此外,还提到了其他隐藏元素的技巧,如通过设置元素位置、使用`overflow`属性和`filter`属性以及`rgba`颜色值来实现元素的隐藏。
70 1
前端基础(十四)_隐藏元素的方法
|
4月前
|
图形学
小功能⭐️Unity判断是否单击到了UI
小功能⭐️Unity判断是否单击到了UI
《QT从基础到进阶·二十六》绘制多个图形项(QGraphicsRectItem,QGraphicsLineItem,QGraphicsPolygonItem)
《QT从基础到进阶·二十六》绘制多个图形项(QGraphicsRectItem,QGraphicsLineItem,QGraphicsPolygonItem)
245 0
|
7月前
|
JSON 定位技术 数据格式
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)(下)
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)
72 0
|
7月前
|
JavaScript 前端开发 定位技术
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)(上)
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)
70 0
|
7月前
|
前端开发
前端知识笔记(十八)———页面首次滑动不可返回
前端知识笔记(十八)———页面首次滑动不可返回
36 0
|
缓存
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
677 0
|
小程序 JavaScript
整理微信小程序控制view隐藏显示的五种方法
整理微信小程序控制view隐藏显示的五种方法
845 0
|
小程序 前端开发 程序员
让别人的小程序长成自己的样子-更换window上下颜色--【浅入深出系列001】
让别人的小程序长成自己的样子-更换window上下颜色--【浅入深出系列001】 这是我的CSDN 的文章 转过来,可能有些许错误。请留言
|
iOS开发
iOS开发 - 写一个刷新的控件(未封装,适合新手学习,查看原理)
iOS开发 - 写一个刷新的控件(未封装,适合新手学习,查看原理)
150 0
iOS开发 - 写一个刷新的控件(未封装,适合新手学习,查看原理)
下一篇
DataWorks