我试图将验证失败的结果从表单传递到新视图,其中将显示验证失败的字段。我的代码一直显示错误消息而不是validationResult,它确实显示在url参数中。
检查验证的方法如下:
def confirmFormToSave() {
def ticket = Ticket.get(params.ticketId)
def ticketId = params.ticketId as long
ValidationResult validationResult = ticketService.validateCurrentTicketForms("", ticketId)
if (!ticketValidationResult.isPassed()) {
log.error "Validation failure, cannot change Ticket status"
redirect(action: 'validateForm', params: [id: params.ticketId, validationResult: validationResult])
return
} else {
params.isGroup = false
redirect(action: 'submitForm', params: params)
}
}
这会将验证失败重定向到以下呈现gsp:
的方法def validateForm() {
def ticket = Ticket.get(params.ticketId)
def ticketId = params.ticketId as long
ValidationResult validationResult = ticketService.validateCurrentTicketForms("", ticketId)
def message = 'Sorry, we could not change the ticket state, validation has failed, please fill out all required fields.'
[ticket: ticket, message: message, validationResult: validationResult]
}
我把它拉回到gsp中如下:
<g:each in="${validationResult}" var="resultError">
<li>${resultError}</li>
</g:each>
我不确定我是否正确地在两个方法之间传递参数,因为目前我基本上检查两次相同的结果,以便在validateForm.gsp中呈现它,这看起来似乎不对。
答案 0 :(得分:0)
我在你的代码中看到了一些奇怪的东西:
1)您正在使用重定向而不是正向或直接方法调用。 http重定向只是一个3xx响应代码,带有Redirect
标头的浏览器带有新网址。您的浏览器将检测响应代码,读取Redirect标头,它将使用新的http请求加载新页面。更多信息:https://en.wikipedia.org/wiki/URL_redirection
所以,您在重定向中使用的params映射将转换为这样的URL:validateForm?id=WHATEVER&validationResult=WHATEVER
,在String中转换validationResult对象,我想你不想这样做,因为你需要模型中的可迭代对象,使用<g:each>
标记循环它。这就是您必须在validateForm
操作中再次进行验证的原因。
如果您的模型中有对象(或其他),则不应使用重定向。如果您需要在模型中使用它们。
2)在您的confirmToSave
操作中,您正在从数据库加载Ticket
实体,但此代码中未使用此变量(这不是什么大问题)
3)您正在重定向参数地图中发送“id”参数,但您在validateForm
操作中获得了“ticketId”参数。
我的建议是直接从validateForm
呈现confirmFormSave
gsp而不进行重定向,类似:
def confirmFormToSave(Long tickectId) {
ValidationResult validationResult = ticketService.validateCurrentTicketForms("", ticketId)
if (!ticketValidationResult.isPassed()) {
log.error "Validation failure, cannot change Ticket status"
String message = 'Sorry, we could not change the ticket state, validation has failed, please fill out all required fields.'
Ticket ticket = Ticket.get(ticketId)
return render(view: "validateForm", model: [ticket: ticket, message: message, validationResult: validationResult])
} else {
params.isGroup = false
redirect(action: 'submitForm', params: params)
}
}