我有一个域类:
class Test {
Integer blah
}
和一个scafollded控制器和视图。在无效blah
(Integer
或1a
)的表单中填写ab
将无法通过验证,但不会使用无效的用户输入重新填充文本框。
我想我明白为什么会发生这种情况(传递给gsp的域实例的blah
因渲染而无法保存字母字符,因为它是Integer
},但有一种很好的方式 - 使用无效输入填充表单?
有几种解决方案:使用正则表达式验证器进行瞬态String blah
,确保输入为数字,然后覆盖Integer blah
getter以获取String blah
值。然后在表单上显示String blah
。或者,为type=number
工作的每个人提供HTML5兼容浏览器:)
有没有更好的方法来解决这个问题?
答案 0 :(得分:3)
如果创建或保存域对象时出错,是否无法将params对象返回到视图,如果存在则重新填充该输入?
答案 1 :(得分:0)
我想我明白为什么会发生这种情况(传递给gsp的域实例为渲染无法保存alpha字符,因为它是一个整数),
正确,通常重新填充表单就像这样
class MyController {
def showForm() {
[bean: new Test()]
}
def processForm(Test bean) {
if (!bean.validate()) {
render view: 'showForm', model: [bean: bean]
} else {
// save the bean or whatever....
}
}
}
showForm.gsp
中表单的字段使用:
<g:textField name="blah" value="${bean.blah}"/>
由于bean
无法返回到包含错误类型值的表单,因此如果使用上面的标记,这些值将“丢失”。但是,这些值仍然应该在params
对象中可用,所以我猜以下应该可以工作(虽然没有测试过)
<g:textField name="blah" value="${bean.blah ?: params.blah}"/>
可以定义一个模板来定义每个字段的逻辑和样式 - 而不是使用新的fields插件为每个字段重复它。
答案 2 :(得分:0)
fieldValue
标记专为此用例设计:
检查已成为数据绑定主题的bean,并从数据绑定期间填充的bean的errors对象中的原始提交值或bean的属性值获取字段的值。获得该值后,它将自动进行HTML编码。
例如:
<g:textField name="blah" value="${fieldValue(bean: testInstance, field: 'blah'}"/>