【问题标题】:Grails: how to return error message from controller logic (i.e. not originating from domain property validation)?Grails:如何从控制器逻辑返回错误消息(即不是源自域属性验证)?
【发布时间】:2012-08-28 08:57:18
【问题描述】:

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

例如创建“忘记密码”功能时,如果用户输入数据库中不存在的用户名,我想显示足够的消息。所以控制器动作会做这样的事情

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

我应该怎么做才能在<g:hasErros>标签内的视图中显示错误?

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

创建@Validateable 命令对象似乎也不对。恕我直言,根据数据库检查值实际上不是命令对象中验证的责任吗?或者是吗?那么它对我来说似乎有点太复杂了。

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

【问题讨论】:

  • 对于那些对我在 Burt beckwith 和 Ian Robers 的输入基础上构建的最终解决方案感兴趣的人:不幸的是,我不允许发布源代码,但总的来说我只是创建了一个 TagLib两个成员:#1 向闪存范围写入添加消息,例如myproject.message(error:'User does not exist')myproject.message(success:'Password changed')
  • 根据类型(错误/成功/警告/信息),将所有消息添加到 flash 中四个列表之一中的两个。成员 #2 是显示消息的实际标签,将所有消息呈现到页面中。它还检索 flash.message 和 bean 错误。希望这会有所帮助

标签: grails view error-handling controller


【解决方案1】:

flash 只是一个 Map,你可以在其中放任何你想要的东西——字符串、数字、对象等。它很方便,因为它只持续一个请求,所以它只是暂时污染会话。生成的 GSP 中的约定是使用 message 键,但这只是一个约定。

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

flash.warning = '...'

flash.error = '...'

并像其他消息一样在 GSP 中检索它。

【讨论】:

  • 确实,这是我在项目中使用的方法 - 我定义了一个处理 flash.messageflash.warningflash.error 的标记库,然后我只需要将 <g:flashMessages/> 放在我的视图中/脚手架模板/布局。
  • 谢谢,我不知道 flash 是地图 :) 这适用于示例案例,但如果你需要一个组合,例如从控制器输出两条错误消息以及更多来自“经典”域验证的可能性?
  • @IanRoberts 感谢您的意见...为此编写一个标记库似乎是个好主意 - 如果我也教它处理 <g:haserrors> 内部的内容,这可能是最好的解决方案我的用例...而且我可能会将错误消息列表放入flash 而不仅仅是一个...应该可以...我会试试这个。
  • 刚刚做了一些测试,我认为这种方法会奏效,而且它比我在研究网络时发现的所有方法都要干净。感谢你们两位的宝贵意见:)
猜你喜欢
  • 2017-02-25
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
相关资源
最近更新 更多