【问题标题】:Grails retrieve controller parameters in g:eachGrails 在 g:each 中检索控制器参数
【发布时间】:2015-06-12 18:06:01
【问题描述】:

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

【问题讨论】:

  • 您用于 g:each 标签的这个 validationResult 似乎是一个对象。据我所知,您在 g:each 标签 中使用 in 参数的列表。如果您发布错误消息会很有帮助。

标签: grails gsp


【解决方案1】:

我在你的代码中看到了一些奇怪的东西:

1) 您使用的是重定向而不是转发或直接方法调用。 http 重定向只是带有 Redirect 标头的 3xx 响应代码到具有新 URL 的浏览器。您的浏览器将检测到响应代码,读取重定向标头,然后它将使用新的 http 请求加载新页面。更多信息:https://en.wikipedia.org/wiki/URL_redirection

因此,您在重定向中使用的参数映射将转换为这样的 url:validateForm?id=WHATEVER&amp;validationResult=WHATEVER,将 validationResult 对象转换为字符串,我想您不想这样做,因为您需要一个可迭代的模型中的对象以使用 &lt;g:each&gt; 标记循环它。这就是您必须在 validateForm 操作中再次进行验证的原因。

如果您的模型中需要对象(或其他对象),则不应使用重定向。

2) 在您的 confirmToSave 操作中,您正在从数据库中加载 Ticket 实体,但您的代码中没有使用此变量(这没什么大不了的)

3) 您在重定向参数映射中发送“id”参数,但在 validateForm 操作中收到“ticketId”参数。

我的建议是直接从confirmFormSave 渲染validateForm 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)
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多