要在Revel中正确显示验证错误,需执行c.Validation.Keep()→c.FlashParams()→重定向,并在模板中用{{.errors.field.Message}}渲染;Flash模块必须启用,且目标Action须调用c.Render()。

要在Revel框架中正确展示后端验证失败时返回的错误提示信息,必须让模板能从Validation上下文里按字段名取到对应Message,并在input旁实时渲染,否则用户看不到哪里填错了。
内联方式:每个字段旁显示错误
第一步:在控制器中调用验证方法并保留错误上下文
比如对username字段做四重检查:c.Validation.Required(username)、c.Validation.MinSize(username, 4)、c.Validation.MaxSize(username, 15)、c.Validation.Match(username, regexp.MustCompile("^\w*$"))。只要任一失败,该字段就会被记入.errors字典。
第二步:调用c.Validation.Keep()→c.FlashParams()→return c.Redirect(Hotels.Settings)。这三步缺一不可,【c.Validation.Keep()不执行,错误信息就不会写入Flash cookie,模板里读不到】。
第三步:在Settings.html模板中,用{{if .errors.username}}判断字段是否有错,再用{{.errors.username.Message}}输出默认或自定义的提示文字。注意:这里的username是变量名,不是表单name属性值,Revel自动把它当key用。
第四步:为input预填充上次提交的值,写成<input name="username" value="{{.flash.username}}">。如果漏掉.flash.username,用户改错时得重新输一遍全部内容。
顶部聚合方式:所有错误集中显示
方法一:手动指定Message并统一收集
在控制器里每个验证调用后追加.Message("用户名至少4位且只能含字母数字下划线"),例如:c.Validation.Required(username).Message("用户名不能为空")。这样.errors里存的就是带Message的结构体,而不是仅靠key推导。
方法二:模板中遍历.errors对象输出全部错误
在Settings.html顶部插入:{{range $key, $err := .errors}}
{{$err.Message}}{{end}}。这比逐个写{{.errors.xxx.Message}}更省事,但会丢失字段定位能力——用户不知道哪条错对应哪个框。
方法三:混合使用,既顶部汇总又保留字段级锚点
先用{{range $key, $err := .errors}}输出所有$err.Message,再在每个input下方补一句{{if .errors.username}}<small class="text-danger">{{.errors.username.Message}}</small>{{end}}。这样兼顾全局提醒和精准修正。
关键前提:确保Flash机制正常工作
① 必须启用Flash模块——检查conf/app.conf中module.flash = true已开启,否则c.FlashParams()无实际效果。
② 重定向目标Action(如Hotels.Settings)必须调用c.Render(),不能直接return nil或c.RenderText(),否则.errors和.flash不会注入模板上下文。
③ 不要试图在GET请求的初始页面里读.errors——它只在重定向回来的那次渲染中有效,【Flash数据是一次性的,第二次访问该URL就自动清空】。


















