0

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

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

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

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

这里的最佳做法是什么?

4

3 回答 3

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>

它应该满足您的需求。

干杯。

于 2015-09-19T15:53:14.323 回答
0

我之前遇到过这个问题并以这种方式解决:

我的注册表单有一个按钮:

<g:submitButton name="register" value="Register" />

所以传入的参数映射应该有“注册”键和“注册”值。

然后我在我的控制器中检查这个参数的存在:

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

换句话说,如果单击“注册”按钮,我会检查控制器,如果是 - 然后执行注册操作。如果否 - 呈现“register.gsp”。

我希望这将有所帮助。

于 2016-07-13T08:00:44.370 回答
0

我不确定我是否完全理解你的问题,但为了让你开始,我推荐这本书“Grails in Action”。它包含许多最佳实践,第 7 章关于数据绑定和错误处理可能会给您一些很好的建议和想法。

于 2015-09-17T07:16:33.267 回答