在Web开发中对于这样的一个流程可能很眼熟:

  • 打开一个网页显示出表单。
  • 用户填写并提交了表单。
  • 如果用户提交了一些无效的信息,或者可能漏掉了一个必填项,表单将会连同用户的数据和错误问题的描述信息返回。
  • 用户再次填写,继续上一步过程,直到提交了一个有效的表单。

在接收端,脚本必须:

  • 检查用户递交的表单数据。
  • 验证数据是否为正确的类型,合适的标准。例如,如果一个用户名被提交,它必须被验证是否只包含了允许的字符。它必须有一个最小长度,不能超过最大长度。用户名不能与已存在的他人用户名重复,甚至是一个保留字等。
  • 过滤数据并清理不安全字符,保证逻辑处理中接收的数据是安全的。
  • 如果需要,预格式化数据(数据需要清除空白或者经过HTML编码等等。)
  • 准备好数据,插入数据库。

尽管上面的过程并不是很复杂,但是通常情况下需要编写很多代码,而且为了显示错误信息,在网页中经常要使用多种不同的控制结构。创建表单验证虽简单,实施起来实在枯燥无味。

表单和验证

对于开发者来说,一般开发过程都是相当复杂,而且大多是在重复一样的工作。假设一个场景项目中忽然需要增加一个表单数据,那么局部代码的整个流程都需要修改。我们知道Go里面struct是常用的一个数据结构,因此beego的form采用了struct来处理表单信息。

首先定义一个开发Web应用时相对应的struct,一个字段对应一个form元素,通过struct的tag来定义相应的元素信息和验证信息,如下所示:

type User struct{Username    string  `form:text,valid:required`Nickname    string  `form:text,valid:required`Age         int     `form:text,valid:required|numeric`Email       string  `form:text,valid:required|valid_email`Introduce   string  `form:textarea`
}

定义好struct之后接下来在controller中这样操作

func (this *AddController) Get() {this.Data["form"] = beego.Form(&User{})this.Layout = "admin/layout.html"this.TplNames = "admin/add.tpl"
}

在模板中这样显示表单

<h1>New Blog Post</h1>
<form action="" method="post">
{{.form.render()}}
</form>

上面我们定义好了整个的第一步,从struct到显示表单的过程,接下来就是用户填写信息,服务器端接收数据然后验证,最后插入数据库。

func (this *AddController) Post() {var user Userform := this.GetInput(&user)if !form.Validates() {return }models.UserInsert(&user)this.Ctx.Redirect(302, "/admin/index")
}

表单类型

以下列表列出来了对应的form元素信息:

名称 参数 功能描述
text No textbox输入框
button No 按钮
checkbox No 多选择框
dropdown No 下拉选择框
file No 文件上传
hidden No 隐藏元素
password No 密码输入框
radio No 单选框
textarea No 文本输入框

表单验证

以下列表将列出可被使用的原生规则

规则 参数 描述 举例
required No 如果元素为空,则返回FALSE  
matches Yes 如果表单元素的值与参数中对应的表单字段的值不相等,则返回FALSE matches[form_item]
is_unique Yes 如果表单元素的值与指定数据表栏位有重复,则返回False(译者注:比如is_unique[User.Email],那么验证类会去查找User表中Email栏位有没有与表单元素一样的值,如存重复,则返回false,这样开发者就不必另写Callback验证代码。) is_unique[table.field]
min_length Yes 如果表单元素值的字符长度少于参数中定义的数字,则返回FALSE min_length[6]
max_length Yes 如果表单元素值的字符长度大于参数中定义的数字,则返回FALSE max_length[12]
exact_length Yes 如果表单元素值的字符长度与参数中定义的数字不符,则返回FALSE exact_length[8]
greater_than Yes 如果表单元素值是非数字类型,或小于参数定义的值,则返回FALSE greater_than[8]
less_than Yes 如果表单元素值是非数字类型,或大于参数定义的值,则返回FALSE less_than[8]
alpha No 如果表单元素值中包含除字母以外的其他字符,则返回FALSE  
alpha_numeric No 如果表单元素值中包含除字母和数字以外的其他字符,则返回FALSE  
alpha_dash No 如果表单元素值中包含除字母/数字/下划线/破折号以外的其他字符,则返回FALSE  
numeric No 如果表单元素值中包含除数字以外的字符,则返回 FALSE  
integer No 如果表单元素中包含除整数以外的字符,则返回FALSE  
decimal Yes 如果表单元素中输入(非小数)不完整的值,则返回FALSE  
is_natural No 如果表单元素值中包含了非自然数的其他数值 (其他数值不包括零),则返回FALSE。自然数形如:0,1,2,3....等等。  
is_natural_no_zero No 如果表单元素值包含了非自然数的其他数值 (其他数值包括零),则返回FALSE。非零的自然数:1,2,3.....等等。  
valid_email No 如果表单元素值包含不合法的email地址,则返回FALSE  
valid_emails No 如果表单元素值中任何一个值包含不合法的email地址(地址之间用英文逗号分割),则返回FALSE。  
valid_ip No 如果表单元素的值不是一个合法的IP地址,则返回FALSE。  
valid_base64 No 如果表单元素的值包含除了base64 编码字符之外的其他字符,则返回FALSE。

golang表单及验证支持相关推荐

  1. 新工具:表单/Cookie 验证网站爬网设置工具

    在今年3月份的blog里面,我曾经说过SharePoint Team将会发布一个补丁来让SharePoint Server 2007的搜索引擎支持对基于表单/Cookie验证的网站进行爬网.今天,Sh ...

  2. oform java_客户端表单通用验证checkForm(oForm)(1)

    *--------------- 客户端表单通用验证checkForm(oForm) ----------------- * 本程序最初是由wanghr100(灰豆宝宝.net)的checkForm基 ...

  3. elementui 嵌套表单验证_vue elementUI 表单嵌套验证的实例代码

    一:表单一级验证 element中from组件内表单验证通过使用el-form标签,绑定model和rules属性进行表单验证 简单的表单验证很简单,在prop内绑定验证属性,然后在rules对象内定 ...

  4. Html利用函数输入学生的性别,JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)...

    JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证) 发布时间:2020-10-08 04:15:08 来源:脚本之家 阅读:73 作者:水山奇 问题:表单怎么在输入后 ...

  5. layui单选框verify_layui lay-verify form表单自定义验证规则详解

    虽然layui的官方文档已经是写的比较详细,但是初次使用的时候总会懵一下,这里纪录一下lay-verify自定义验证规则的时候到底放哪. html: 提交 js: form.verify({ //数组 ...

  6. js登录特效+ajax提交表单+异步刷新验证

    今天成功测试一种js登录特效+ajax提交表单+异步刷新验证,登录时特效提醒,无刷新ajax提交表单,获取验证结果,跳转正式页面:废话不多说,先直接分享代码: 1.主界面index.php  加载的这 ...

  7. html表单 asp验证,ASP中JavaScript处理复杂表单的生成与验证

    ASP中JavaScript处理复杂表单的生成与验证 更新时间:2007年03月25日 00:00:00   作者: 这里所谓的复杂表单,是指表单中包含多种不同的输入类型,比如下拉列表框.单行文本.多 ...

  8. 在ASP.NET中如何用C#.NET实现基于表单的验证

    这篇文章引用到了Microsoft .NET类库中的以下名空间: System.Data.SqlClient System.Web.Security ------------------------- ...

  9. Angualr6表单提交验证并跳转

    在Angular6中,使用NG-ZRROR作为前端开发框架,在进行表单开发时遇到了一些问题,最后解决了,在此记录. 1.表单构造: 引入forms: import { FormGroup, FormB ...

最新文章

  1. Java虚拟机中的栈和堆
  2. (11/24) css进阶:Less文件的打包和分离
  3. SAP Cloud Application Programming bookshop 例子的 Fiori Preview
  4. 【安卓开发】Android初级开发(okhttp3发送带header与带参数的GET请求)
  5. 新疆计算机二级慨库,2020新疆维吾尔自治区计算机二级易考套餐:二级MS Office高级应用全程班(网课+题库+教材)...
  6. window命令行大全
  7. 全球首发!惯性导航导论(剑桥大学)第十一部分
  8. python中对象的概念是什么_python面向对象编程的基本概念
  9. IEC_60068-2-64基本环境试验规程第2-64部分试验试验Fh振动、宽带随机抽样
  10. 新宠混血儿诞生记--Java+PHP整合
  11. 【搜索】【usaco 4.1.4】奶牛加密术
  12. JDK如何安装与配置环境变量
  13. ubuntu永久修改mac地址
  14. Hoo Smart Chain 万物生长计划火热报名中,可视化公链迸发勃勃生机
  15. jquery 基础教程[温故而知新二]
  16. Youtube内容正在失控
  17. Object.assign()方法
  18. 一文了解深度学习实战——预测篇
  19. Unity editor 快速上手 quick start
  20. 跟着 伍逸 老师学GDI+ 之Pen的DashPatten属性

热门文章

  1. 【Android 安全】DEX 加密 ( Proguard 简介 | Proguard 相关网址 | Proguard 混淆配置 )
  2. 基于IPV6的数据包分析
  3. 《Linux 性能及调优指南》1.6 了解Linux性能指标
  4. oracle数据恢复方法
  5. chrome手机模拟器显示尺寸不正确
  6. OpenGL之glMatrixMode函数的用法
  7. 机器人运动学_不同D-H矩阵的对比
  8. 二叉树的递归遍历和层序遍历(c/c++)
  9. 程序猿修仙之路--算法之直接插入排序
  10. 将php-fpm添加至service服务