grails-显示闪存消息

grails-显示闪存消息,grails,Grails,我是Grails的新手,我有一个问题对你们大多数人来说应该很简单 我有一个页面显示一个对象列表。如果删除对象时出现DataIntegrityViolation,我想显示一条消息。我正在做的是: def delete() { def instanceToDelete= Myobject.get(params.id) try { instanceToDelete.delete(flush: true) redirect(action: "list",

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

我有一个页面显示一个
对象
列表。如果删除
对象时出现
DataIntegrityViolation
,我想显示一条消息。我正在做的是:

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>

${flash.message}


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

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

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)
然后,您可以检查包含
error
键的
flash
对象,并对此类消息使用不同的样式:

<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>

${flash.error}
${flash.message}

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

对于控制器:

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
    }
}
对于您的普惠制:

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

${message}
但是Gregg是对的,您应该永远不要在没有
重定向的情况下修改客户机数据。
如果您这样做,用户可能会刷新(或返回)相同的url,并意外地再次尝试相同的操作。你真的应该喜欢hitt5的答案。

这可以帮助你:

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>

${flash.success}
${flash.error}
//后端代码示例
def save(){
如果(参数名){
. 
. 
object.save();
flash.message=“保存成功”
} 
否则{
flash.message=“保存失败”
}
//HTML示例
${flash.message}

问题是关于什么的?代码似乎是正确的,如果捕获到DataIntegrityViolationException,您将在视图中看到“some message”字符串。问题是我现在看不到它。您谈论的是样式。有点误解(=不,我认为问题不在于样式。问题是在
catch
块中没有重定向。在
try
中,如果一切顺利,您将重定向到
list.gsp
。但是在
catch
中,您不呈现任何视图来处理flash对象。我如何在不重定向的情况下显示消息?基本上我不想o重定向到列表,因为我在那里重新加载对象列表,如果我不删除任何内容,则不需要重新加载。如果不重新加载浏览器(服务器重定向/转发),则无法修改客户端数据除非您是通过Ajax提交请求。改进您的评论的建议:添加一些文字说明此代码的关键部分是什么,它的作用是什么,以及为什么这样做最好。
// 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>