整数验证 - 不重新显示用户输入

时间:2012-02-26 23:43:43

标签: grails groovy

我有一个域类:

class Test {
    Integer blah
}

和一个scafollded控制器和视图。在无效blahInteger1a)的表单中填写ab将无法通过验证,但不会使用无效的用户输入重新填充文本框。

我想我明白为什么会发生这种情况(传递给gsp的域实例的blah因渲染而无法保存字母字符,因为它是Integer},但有一种很好的方式 - 使用无效输入填充表单?

有几种解决方案:使用正则表达式验证器进行瞬态String blah,确保输入为数字,然后覆盖Integer blah getter以获取String blah值。然后在表单上显示String blah。或者,为type=number工作的每个人提供HTML5兼容浏览器:)

有没有更好的方法来解决这个问题?

3 个答案:

答案 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'}"/>