Grails:如何从控制器逻辑返回错误消息(即,不是来自域属性验证)?

Grails:如何从控制器逻辑返回错误消息(即,不是来自域属性验证)?,grails,view,error-handling,controller,Grails,View,Error Handling,Controller,无法始终使用域或命令对象验证合理地检查错误,例如用户输入错误 例如,在创建“忘记密码”功能时,如果用户输入了数据库中不存在的用户名,我希望显示适当的消息。控制器的动作是这样的 ... def user = User.find{name==uname} if(!user) { // user not found in db, output error and render view again render view: 'forgotPassword' return } /

无法始终使用域或命令对象验证合理地检查错误,例如用户输入错误

例如,在创建“忘记密码”功能时,如果用户输入了数据库中不存在的用户名,我希望显示适当的消息。控制器的动作是这样的

...
def user = User.find{name==uname}
if(!user) {
    // user not found in db, output error and render view again
    render view: 'forgotPassword'
    return
}
// do reset password stuff
...
如何在
标记内的视图中显示错误

flash.message
(正如生成的控制器/视图所做的那样)在我看来并不正确,因为我不仅显示了一条信息消息,而且还显示了一条错误消息。这就是为什么我认为消息应该由
标记处理,并显示为域验证错误。(对于用户来说,这是相同的反馈级别:“由于输入错误而无法工作”

创建一个
@validatable
命令对象似乎也不对。依我看,检查数据库中的值实际上不是在命令对象中进行验证的责任?或者是吗?那么对我来说,它似乎有点太复杂了


那么最好的方法是什么呢?其他框架(例如Wicket)提供了不同的方法,如
error(String-msg)
info(String-msg)
允许在视图中轻松处理反馈消息。Grails中是否有类似的概念,我只是还没有找到?

flash
只是一个映射,您可以在其中放入您想要的任何内容-字符串、数字、对象等。它很方便,因为它只支持一个请求,所以它只会暂时污染会话生成的GSP中的约定是使用
消息
键,但这只是一种约定

如果要存储另一条消息,请将其存储在不同的密钥中:

flash.warning = '...'


实际上,这是我在项目中使用的方法-我定义了一个标记库,用于处理
flash.message
flash.warning
flash.error
,然后我只需将
放在我的视图/脚手架模板/布局中。谢谢,我不知道
flash
作为一个映射:)这对于示例案例来说是可行的,但是如果您需要一个组合,例如从控制器输出两条错误消息以及从“经典”域验证输出更多错误消息的可能性,该怎么办?@IanRoberts感谢您的输入。。。为此编写标记库似乎是个好主意-如果我也教它处理
中的内容,这可能是我的用例的最佳解决方案。。。我可能会将错误MSG列表放入
flash
中,而不仅仅是一个。。。应该有用。。。。我会试试这个。刚刚做了一些测试,我认为这个方法会奏效,而且比我在研究网络时发现的一切都要干净。感谢你们两位的宝贵意见:)对于那些对最终解决方案感兴趣的人,我在Burt beckwith和Ian Robers的意见的基础上构建了:不幸的是,我不允许发布源代码,但一般来说,我只是创建了一个包含两个成员的标记库:#1编写一条消息添加到flash scope,例如,
myproject.message(错误:'User not existence')
myproject.message(成功:'Password changed')
所有MSG根据其类型(错误/成功/警告/信息)在
flash
中添加四个列表中的两个。Member#2是显示消息的实际标记,将所有MSG呈现到页面中。它还检索flash.message和bean错误。希望这有帮助
flash.error = '...'