12

我是 Grails 的新手,我有一个问题对你们大多数人来说应该很容易。

我有一个显示object列表的页面。如果删除了DataIntegrityViolation一个,我想显示一条消息。object我正在做的是:

def delete() {

    def instanceToDelete= Myobject.get(params.id)
    try {
        instanceToDelete.delete(flush: true)
        redirect(action: "list", id: params.id)
    }
    catch (DataIntegrityViolationException e) {
        flash.message = "some message"
        //I want to refresh the div containing the flash.message here
    }
}

此处应显示 Flash 消息:

  <g:if test="${flash.message}">
  <div class="alert alert-error" style="display: block">${flash.message}</div>

抱歉——我知道这是一个愚蠢的问题,但我真的找不到解决方案。

4

4 回答 4

22

flash对象是Map存储键/值对的对象,因此您可以为错误消息定义自己的键。例如:

try {
    instanceToDelete.delete(flush: true)            
    flash.message = "successfully deleted object"
 }
 catch (DataIntegrityViolationException e) {
    flash.error = "could not delete object"            
 }
redirect(action: "list", id: params.id)

然后您可以检查flash包含error密钥的对象,并为该类型的消息使用不同的样式:

<g:if test="${flash.error}">
  <div class="alert alert-error" style="display: block">${flash.error}</div>
</g:if>
<g:if test="${flash.message}">
  <div class="message" style="display: block">${flash.message}</div>
</g:if>
于 2013-01-11T12:27:58.043 回答
6
// backend code example

def save () { 
    if(params.name) { 
          . 
          . 
      object.save(); 
      flash.message =  "Saved successfully" 
    } 
    else { 
        flash.message = "Saved fail"
    }

// HTML example

<g:if test="${flash.message}">
   <div class="update_message" role="status">${flash.message}</div>
</g:if>
于 2019-07-24T10:24:49.013 回答
3

这可以帮助您:

def delete() {
    def instanceToDelete= Myobject.get(params.id)
    try {
        instanceToDelete.delete(flush: true)
        flash.success = "Object deleted correctly"
    } catch (DataIntegrityViolationException e) {
        flash.error = "Something goes wrong"
    }
    redirect(action: "list", id: params.id)
}

在所有代码之后重定向到 gsp,如果有错误或一切顺利,可以存储。

您可以将消息放在不同的变量中以区分错误和成功。

<g:if test="${flash.success}">
    <div class="alert alert-success" style="display: block">${flash.success}</div>
</g:if>
<g:if test="${flash.error}">
    <div class="alert alert-error" style="display: block">${flash.error}</div>
</g:if>
于 2014-12-10T22:33:42.513 回答
1

严格答案:只需返回您的消息(或使用模型图渲染)

对于您的控制器:

def delete() {

    def instanceToDelete= Myobject.get(params.id)
    try {
        instanceToDelete.delete(flush: true)
        redirect(action: "list", id: params.id)
    }
    catch (DataIntegrityViolationException e) {
        render view:'delete', model:[message: "some message"]
        //I want to refresh the div containing the flash.message here
    }
}

对于您的 gsp :

<g:if test="${message}">
    <div class="alert alert-error" style="display: block">${message}</div>

但是 Gregg 是对的,你永远不应该在没有redirect. 如果这样做,用户可能会刷新(或返回)相同的 url,并意外地再次尝试相同的操作。你真的应该像 hitt5 的回答一样。

于 2013-01-13T00:30:29.153 回答