如果我有一个动作def formPage()
,我希望能够在该页面上保存表单,如果出现错误则显示包含先前输入值的表单,如果成功则显示空白表单。
我的问题是:formPage
调用saveFormPage(FormPageCommand fpc)
之类的内容是最佳做法吗?然后,saveFormPage
可以使用或不使用先前输入的值来呈现formPage
。这种方法的问题是用户可以单击地址栏,按Enter键,然后获取一些错误,因为表单尚未填写,命令对象会看到所有空值或空值。
另一种方法可能只是拥有def formPage(FormPageCommand fpc)
,并忽略错误,如果没有填写任何值,只显示一个空白表单。
如果没有填写任何值,也可以调用saveFormPage(FormPageCommand fpc)
并重定向回formPage()
。
这里的最佳做法是什么?
答案 0 :(得分:0)
我不确定我是否完全理解你的问题,但为了让你开始我推荐“Grails in Action”这本书。它包含许多最佳实践,关于数据绑定和错误处理的第7章可能会为您提供一些很好的建议和想法。
答案 1 :(得分:0)
试试这个例子:
您的控制器
class MyFormController {
def formPage() {
[cmd: new FormPageCommand()]
}
def saveFormPage(FormPageCommand cmd) {
if (cmd.hasErrors()) {
render view: "formPage", model: [cmd: cmd]
} else {
// Process form
// ......
// Redirect back formPage() to display a new form
redirect action: "formPage"
}
}
}
您的命令对象
class FormPageCommand {
String optionalValue
String requiredValue
static constraints = {
optionalValue(nullable: true, blank: true)
requiredValue(nullable: false, blank: false)
}
}
您的formPage.gsp
<g:form controller="myForm" action="saveFormPage" method="POST">
<label>Required value *</label>
<g:textField name="requiredValue" value="${cmd.requiredValue}"/>
<g:if test="${cmd.errors.getFieldError('requiredValue')}">
<g:message error="${cmd.errors.getFieldError('requiredValue')}"/>
</g:if>
<label>Optional value</label>
<g:textField name="optionalValue" value="${cmd.optionalValue}"/>
<g:submitButton name="submit"/>
</g:form>
它应该满足您的需求。
干杯。
答案 2 :(得分:0)
之前我遇到过这个问题并以这种方式解决了这个问题:
我的注册表有一个按钮:
<g:submitButton name="register" value="Register" />
所以传入的参数图应该有&#34;寄存器&#34;键入&#34;注册&#34;值。
然后我在我的控制器中检查这个参数是否存在:
def register(UserRegisterCommand urc) {
if (params.register) {
//some registration actions
}
}
换句话说,我检查控制器是否有&#34;注册&#34;单击按钮,如果是 - 然后执行注册操作。如果不是 - &#34; register.gsp&#34;渲染。
我希望这会有所帮助。