Grails关于表单重定向/呈现的最佳实践

Grails关于表单重定向/呈现的最佳实践,grails,command-objects,Grails,Command Objects,如果我有一个操作def formPage(),我希望能够在该页面上保存表单,如果有错误,则显示具有先前输入值的表单,如果成功,则显示空白表单 我的问题是:formPage调用类似于saveFormPage(FormPageCommand-fpc)的东西是否是最佳实践saveFormPage然后可以使用或不使用先前输入的值呈现formPage。这种方法的问题是,用户可以单击地址栏,按enter键,然后由于表单尚未填写而出现大量错误,并且命令对象会看到所有的空值或空白值 另一种方法可能是只使用def

如果我有一个操作
def formPage()
,我希望能够在该页面上保存表单,如果有错误,则显示具有先前输入值的表单,如果成功,则显示空白表单

我的问题是:
formPage
调用类似于
saveFormPage(FormPageCommand-fpc)
的东西是否是最佳实践
saveFormPage
然后可以使用或不使用先前输入的值呈现
formPage
。这种方法的问题是,用户可以单击地址栏,按enter键,然后由于表单尚未填写而出现大量错误,并且命令对象会看到所有的空值或空白值

另一种方法可能是只使用
def formPage(FormPageCommand fpc)
,忽略错误,如果没有填写任何值,只显示空白表单

如果没有填写任何值,也可以调用
saveFormPage(FormPageCommand fpc)
并重定向回
formPage()


这里的最佳实践是什么?

我不确定我是否完全理解你的问题,但为了让你开始,我推荐《圣杯在行动》一书。它包含了许多最佳实践,第7章关于数据绑定和错误处理的内容可能会给您一些好的建议和想法。

尝试以下示例:

你的控制器

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>

要求值*
可选值
它应该满足你的需要


干杯。

我以前遇到过这个问题,并通过以下方式解决了它:

我的注册表有一个按钮:

<g:submitButton name="register" value="Register" />
换句话说,我在控制器中检查是否单击了“注册”按钮,如果是,则执行注册操作。如果否,则呈现“register.gsp”

我希望这会有所帮助

def register(UserRegisterCommand urc) {
    if (params.register) {
        //some registration actions
    } 
}