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

相关文章
|
2月前
|
JavaScript 前端开发 Java
若依框架---选中某值 其他值自动回调填充
若依框架---选中某值 其他值自动回调填充
54 0
|
3月前
|
JSON 定位技术 数据格式
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)(下)
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)
32 0
|
3月前
|
JavaScript 前端开发 定位技术
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)(上)
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)
34 0
|
XML 开发框架 .NET
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
144 0
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
|
Web App开发
使用调试的方式搞清楚SAP UI5应用标题的更改方式
使用调试的方式搞清楚SAP UI5应用标题的更改方式
使用调试的方式搞清楚SAP UI5应用标题的更改方式
如何使用配置的方式修改SAP C4C UI的字段标签,以及背后的工作原理
I was asked by one partner that it is expected to adapt the label of “New” button into “Add”, and change the text of first menu item from “Add” to “From Contact”.
如何使用配置的方式修改SAP C4C UI的字段标签,以及背后的工作原理
|
算法 数据库 内存技术
【视频】自然框架之分页控件的使用方法(一) PostBack方式的一般分页方式
前言:分页控件的优点   1、 按需所取 —— 需要几条记录就从数据库里提取几条记录,不会多取。 2、 使用简单 —— 设置几个属性就可以实现分页的功能。 3、 多种分页算法 —— (即分页用的SQL语句)可以根据不同的需求灵活选择 4、 支持多种数据库 —— 用不同的分页算法对应不同的数据库。
1088 0
|
Web App开发
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能
前面的几篇文章中,我们给控件添加一个复杂的类型Scope,并且给它的类型提供的一个类型转换器,现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了。但是你有没有发现,在属性浏览器里编辑这个属性的值还是不太方便。
666 0
|
Android开发 索引
第二十四章:页面导航(十一)
消息中心您可能不喜欢两个页面类直接相互调用方法的想法。 它似乎适用于小样本,但对于具有大量类间通信的大型程序,您可能更喜欢一些不需要实际页面实例的更灵活的东西。这样的工具是Xamarin.Forms MessagingCenter类。
524 0
|
C# 前端开发
WPF Adorner+附加属性 实现控件友好提示
原文:WPF Adorner+附加属性 实现控件友好提示 标题太空泛,直接上图   无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成。
951 0

相关实验场景

更多