Revel提供内建的函数来验证参数.这里有一对部件:
- 一个验证上下文收集器和消息验证错误(keys和消息)
- 帮助函数检查数据并把错误信息加入上下文
- 一个模板函数从验证上下的key获得错误信息
更深入的了解验证可以看一下 示例demo
内联错误信息
这个示例演示用内联错误信息验证字段.
func (c MyApp) SaveUser(username string) rev.Result { // Username (required) must be between 4 and 15 letters (inclusive). c.Validation.Required(username) c.Validation.MaxSize(username, 15) c.Validation.MinSize(username, 4) c.Validation.Match(username, regexp.MustCompile("^\\w*$")) if c.Validation.HasErrors() { // Store the validation errors in the flash context and redirect. c.Validation.Keep() c.FlashParams() return c.Redirect(Hotels.Settings) } // All the data checked out! ... }
一步一步的:
- 在username上评估4个不同的条件(需要,最大值,最小值,匹配).
- 每一个评估返回一个ValidationResult.失败的ValidationResults存放在Validation上下文.
- 作为构建应用程序的一部分.Revel记录被验证的变量的名字并用它作为Validation上下文的缺省key (为了之后查询)
- Validation.HasErrors() 如果上下文是非空的返回true
- Validation.Keep() 告诉Revel序列化ValidationErrors到Flash cookie.
- Revel返回一个转向到Hotels.Settings action
Hotels.Settings aciton渲染一个模板:
{{/* app/views/Hotels/Settings.html */}} ... {{if .errors}}Please fix errors marked below!{{end}} ... <p class="{{if .errors.username}}error{{end}}"> Username: <input name="username" value="{{.flash.username}}"/> <span class="error">{{.errors.username.Message}}</span> </p>
它做了3件事:
- 检查errors字典的username看看是否这个字段有一个错误
- 用flash的参数值预填充input
- 在字段旁边显示错误提示信息(我们没有规定任何错误信息,但是每一个验证函数提供了一个默认的)
注意:字段模板帮助函数让使用验证错误框架写模板更方便一些.
顶部错误信息
如果错误信息被收集到一个地方,模板可以被简化(例如, 一个大的红色红框在页面的最上面)
这里和之前的示例只有两个不同
- 我们在ValidationError上规定一个消息来代替key
- 我们在表单的最上方打印全部的错误消息
下面是代码:
func (c MyApp) SaveUser(username string) rev.Result { // Username (required) must be between 4 and 15 letters (inclusive). c.Validation.Required(username).Message("Please enter a username") c.Validation.MaxSize(username, 15).Message("Username must be at most 15 characters long") c.Validation.MinSize(username, 4).Message("Username must be at least 4 characters long") c.Validation.Match(username, regexp.MustCompile("^\\w*$")).Message("Username must be all letters") if c.Validation.HasErrors() { // Store the validation errors in the flash context and redirect. c.Validation.Keep() c.FlashParams() return c.Redirect(Hotels.Settings) } // All the data checked out! ... }
模板:
{{/* app/views/Hotels/Settings.html */}} ... {{if .errors}} <div class="error> <ul> {{range .errors}} <li> {{.Message}} {{end}} </ul> </div> {{end}} ...
至此结束.