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