Grails 表单最佳实践 redirection/rendering
Grails best practice on form redirection/rendering
如果我有一个操作 def formPage()
,我希望能够在该页面上保存表单,如果有错误则显示包含之前输入的值的表单,如果错误则显示空白表单成功。
我的问题是:formPage
调用 saveFormPage(FormPageCommand fpc)
之类的东西是最佳做法吗? saveFormPage
然后可以使用或不使用先前输入的值来呈现 formPage
。这种方法的问题是用户可以单击地址栏,按回车键,然后由于尚未填写表单而出现大量错误,并且命令对象看到所有空值或空白值。
另一种方法可能是只有一个 def formPage(FormPageCommand fpc)
,如果填写了 none 个值,则忽略错误并只显示空白表格。
如果填写了 none 个值,也可以调用 saveFormPage(FormPageCommand fpc)
并重定向回 formPage()
。
此处的最佳做法是什么?
我不确定我是否完全理解您的问题,但为了让您入门,我推荐这本书 "Grails in Action"。它包含很多最佳实践,关于数据绑定和错误处理的第 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" 键和 "Register" 值。
然后我检查我的控制器中是否存在这个参数:
def register(UserRegisterCommand urc) {
if (params.register) {
//some registration actions
}
}
换句话说,我检查控制器是否单击了 "Register" 按钮,如果是 - 然后执行注册操作。如果没有 - 呈现 "register.gsp"。
希望对您有所帮助。
如果我有一个操作 def formPage()
,我希望能够在该页面上保存表单,如果有错误则显示包含之前输入的值的表单,如果错误则显示空白表单成功。
我的问题是:formPage
调用 saveFormPage(FormPageCommand fpc)
之类的东西是最佳做法吗? saveFormPage
然后可以使用或不使用先前输入的值来呈现 formPage
。这种方法的问题是用户可以单击地址栏,按回车键,然后由于尚未填写表单而出现大量错误,并且命令对象看到所有空值或空白值。
另一种方法可能是只有一个 def formPage(FormPageCommand fpc)
,如果填写了 none 个值,则忽略错误并只显示空白表格。
如果填写了 none 个值,也可以调用 saveFormPage(FormPageCommand fpc)
并重定向回 formPage()
。
此处的最佳做法是什么?
我不确定我是否完全理解您的问题,但为了让您入门,我推荐这本书 "Grails in Action"。它包含很多最佳实践,关于数据绑定和错误处理的第 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" 键和 "Register" 值。
然后我检查我的控制器中是否存在这个参数:
def register(UserRegisterCommand urc) {
if (params.register) {
//some registration actions
}
}
换句话说,我检查控制器是否单击了 "Register" 按钮,如果是 - 然后执行注册操作。如果没有 - 呈现 "register.gsp"。
希望对您有所帮助。