我正在使用Grails框架开发应用程序,当从gsp视图中将hasErrors作为方法调用时,我遇到了问题。
我有一个表单,得到的值从数据库(默认值)填充。这些值存储在会话对象中。用户可以编辑表单字段中的值,并将结果发送回数据库。在持久化数据之前,我有一个验证数据的命令对象。如果有错误,命令对象将以相同的形式呈现视图,并突出显示错误。
我要做的是让表单字段由存储在会话对象中的值填充,除非有命令对象的错误。在这种情况下,字段应该由用户输入的错误值填充。
下面是代码片段:
<g:textField name="somename" id="someid" value="${hasErrors(bean: commandobject, field: 'somename') ? fieldValue(bean: commandobject, field: 'somename') : session.somevalue}" />
上面代码的问题是,无论字段中输入的值是对还是错,字段总是以来自会话对象的值结束。有解决办法吗,还是我一开始就做错了什么?
当您调用hasErrors
时,您正在调用不返回布尔值的<g:hasErrors/>
标记-它会查看条件并有条件地调用标记体。在这种描述下,它的行为方式是有道理的。
我的建议是创建您自己的TagLib
和使用commandobject.errors.hasFieldErrors('somename')
[docs]在您的条件(以获得您正在寻找的布尔值)。
作为GSP中的方法调用的hasErrors
与作为标记<g:hasErrors>
的工作方式略有不同。前者的目的是设置CSS类div或跨度等…
e.g. <div class="prop ${hasErrors(bean:parent, field:'child.name', 'errors')}">
,其中errors
为CSS类名。所以如果你没有指定输出字符串,默认情况下它似乎返回false,所以要解决你的情况,返回'1'。所以你的代码应该是这样的:
<g:textField name="somename" id="someid" value="${hasErrors(bean: commandobject, field: 'somename', '1') ? fieldValue(bean: commandobject, field: 'somename') : session.somevalue}" />
这也适用于<g:if>