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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaBean的详细及引用

1.JavaBean实际是具有统一接口格式的java类 2.JavaBean的组成&#xff1a;属性(Properties)、方法(Method)、事件(Events) 3.一个JavaBean的例子(该例子是用的Simple属性<属性在以后说>) //我遵循的习惯是类名大写&#xff0c;包名小写package com;//意思是将 FirstBean这…

驱动开发实战之TcpClient

场景模拟假设你有一批非标设备需要对接&#xff0c;你需要根据设备方提供的协议&#xff0c;为IoTGateway开发驱动&#xff0c;进行数据交互。文章比较长也可以到官网会有更好的体验&#xff0c;地址:http://iotgateway.net/docs/iotgateway/driver/tcpclient请先浏览上一篇驱动…

【遥感数字图像处理实验】Erdas版详细图文实验教程(8实验全)

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 遥感数字图像的处理&#xff0c;是对遥感数字图像的计算机处理。与工业和医学数字图像不同&#xff0c;遥感数字图像类型更为多样&#xff0c;内容更为复杂。因此&#xff0c;遥感数字图像的处理&#xff0c;不仅需要掌握…

WEBAPI 增加身份验证 (OAUTH 2.0方式)

1&#xff0c;在Webapi项目下添加如下引用&#xff1a;Microsoft.AspNet.WebApi.OwinOwinMicrosoft.Owin.Host.SystemWebMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Security.CookiesMicrosoft.AspNet.Identity.OwinMicrosoft.Owin.Cors2&#xff0c; 在项目下新建Startup类…

无代码iVX编程实现简单 小蜜蜂 经典游戏

首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后选择相对定位&#xff0c;咱们选择2D游戏类型制作一个简单小蜜蜂游戏&#xff1a; 接着咱们创建一个物理世界&#xff0c;并且将页面布局如以下&#xff1a; 以上布局中&#xff0c;矩形为模拟飞机、…

【无人机航空摄影测量精品教程】目录:Pix4d、EPS、CC、PhotoScan、Godwork项目化作业流程及注意事项汇总

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 该专栏为目前最为热门的无人机航测内外业项目&#xff0c;主要内容包括&#xff1a;无人机航测外业作业流程&#xff08;像控点布设、航线规划、仿地飞行、航拍&#xff09;和内业数据处理软件&#xff08;Pix4d、CC、EP…

WPF 基础控件之 Slider 样式

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButtonSlider 实现下面的效果1&#xff09;Slider来实现动画&#xff1b;Grid嵌套 Border并设置S…

SQL 通过syscolumns.xtype动态查找指定数据类型字段所包含的数据

表中太多列&#xff0c;只想查找某些比如&#xff0c;数据类型为varchar的字段的数据。 思路&#xff1a;1、先获取列名&#xff1a; select * from syscolumns where id(select max(id) from sysobjects where xtypeu and nametest_A)2、查找指定数据类型&#xff0c;xtype就…

css案例学习之span边框实现的特殊效果

bottom left bottom right top left top right 配合颜色来使用&#xff0c;实现一些神奇的效果 #menu a span{height:0;width:0;/*border-top:solid 6px #fff;border-left:solid 6px #f90;*//*border-top:solid 6px #fff;border-right:solid 6px #f90;*//*border-bottom:solid …

网页版消消乐快速实现,无代码吗iVX 真那么简单?

最近没事想做个消消乐&#xff0c;然后听说 iVX 免费了&#xff0c;所以又跑去看看 iVX 了&#xff0c;就用一个无代码来看看消消乐怎么玩吧。 首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后咱们不需要游戏类型也可以制作一个消消乐游戏&#xff1a…

虚拟化记录--No.1

近段时间&#xff0c;会花些时间做关于系统虚拟化的工作。所以会做一些这样的记录。相信很多东西不会特别成体系&#xff0c;每个人因为关注的不同而记录和学习的重点也会有比较大的出入。这篇是NO.1(注意不是TOP 1 )真的是由于对于ORACLE很有感觉&#xff0c;所以上手去做的也…

C# Java间进行RSA加密解密交互

这里&#xff0c;讲一下RSA算法加解密在C#和Java之间交互的问题&#xff0c;这两天纠结了很久&#xff0c;也看了很多其他人写的文章&#xff0c;颇受裨益&#xff0c;但没能解决我的实际问题&#xff0c;终于&#xff0c;还是被我捣鼓出来了。 首先&#xff0c;介绍一下写这代…

【Microstation】三维建模基础及软件入门到精通实验教程目录

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 MicroStation是一款非常不错的二维和三维设计软件&#xff0c;由奔特力&#xff08;Bentley&#xff09;工程软件系统有限公司开发的一款软件。在CAD设计上该软件是和AutoCAD是齐名的软件&#xff0c;其专用的文件格式是…

无代码iVX编程实现简单魂斗罗

首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后咱们选择2D游戏类型制作一个简单魂斗罗游戏&#xff1a; 随后咱们开始创建一个物理世界&#xff0c;不并且在物理世界之下创建一个一个图片添加物体属性&#xff0c;在物体属性中更改对应的属性内容&am…

【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 Python语言是目前很火热的语言&#xff0c;极大的促进了人工智能发展。你知道在ArcGIS中也会有python的身影吗&#xff1f;事实上&#xff0c;在ArcGIS中使用Python会起到事半功倍的效果&#xff0c;大大提高工作效率&am…

Android使用C/C++来保存密钥

Android使用C/C来保存密钥本文主要介绍如何通过native方法调用取出密钥&#xff0c;以替代原本直接写在Java中&#xff0c;或写在gradle脚本中的不安全方式。为什么要这么做 如果需要在本地存储一个密钥串&#xff0c;典型的方式有 1. 直接写在java source code中 2. 写在gradl…

无代码iVX编程实现简单跳跃超级玛丽游戏

首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后咱们选择2D游戏类型制作一个简单跳跃游戏&#xff1a; 接下来创建几个图片&#xff0c;并且添加物体&#xff0c;如图所示&#xff1a; 在此需要更改对应称重地面的阻尼值&#xff0c;让其能够缓慢降落…

【三维激光扫描】实验01:环境搭建CAD2014+StonexSiScan软件安装

目 录 一、CAD2014简体中文版安装1. 安装过程2. 激活过程二、Si-Scan安装1. 主程序安装2. 驱动安装一、CAD2014简体中文版安装 1. 安装过程 双击安装包:AutoCAD_2014_Simplified_Chinese_Win_64bit_dlm.sfx.exe,进行自解压。 解压完成后,如下图所示,点击【安装】。 接受许…

C# 11 新特性:原始字符串

之前我们经常需要使用 string 类型定义字符串文本&#xff0c;字符串文本用一对双引号括起来表示&#xff1a;var str "Hello MyIO";字符串可包含任何字符文本&#xff0c;但是有些字符需要转义才能表示&#xff0c;比如双引号要转义成\"&#xff1a;var str …

bzoj1011

因为允许5%的误差。。所以把&#xff1e;一定长度的一段看成一段近似计算就行了。。 1 #include<cstdio>2 #include<cstdlib>3 #include<cstring>4 #include<ctime>5 #include<cmath>6 #include<iostream>7 #include<algorithm>8 #i…