Grails以g:each检索控制器参数

时间:2015-06-12 18:06:02

标签: grails gsp

我试图将验证失败的结果从表单传递到新视图,其中将显示验证失败的字段。我的代码一直显示错误消息而不是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中呈现它,这看起来似乎不对。

1 个答案:

答案 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)
    }
  }