我正在尝试将Param数据从视图传递到控制器,我遇到了麻烦。这就是我目前正在尝试做的事情。
查看:
<form action="${doStuffURL}" method='post' params="[keyId: ${mykey.id[i]}]"><g:actionSubmit value="doStuff"/></form>
控制器:
def myObjectService //inject service object
def doStuff = {
myObjectService.doStuff("${params.keyId}") //this blows up because it's value of NULL
myObjectService.doStuff(8) //this works fine
}
它到达方法块,因为错误日志显示“没有方法MyObject.doStuff()的签名适用于参数类型:values:[null]。”此外,我能够从另一个字段中看到$ {mykey.id [i]}数据,因此数据肯定在视图中。
如何让控制器读取Param数据?
谢谢!
答案 0 :(得分:0)
错误很多:
<form action="${doStuffURL}" method='post' params="[keyId: ${mykey.id[i]}]"><g:actionSubmit value="doStuff"/></form>
为什么不使用:
<g:form name="something" controller="yourController" action="youraction">
正如您在上面所看到的,您必须生成 表格网址(也许你有理由)
控制器:
def doStuff = {
MyObject.doStuff("${params.keyId}")
}
Differences between action and methods in Grails controllers
首先,为什么你应该改变控制器,但我的实际关注点是
MyObject.doStuff
是MyObject.doStuff
静态方法吗?
因为只有当这样的呼叫would work时才会这样。该链接显示静态方法。被称为here并且由于它通过executor.registerSenderFault
调用它而使你感到困惑,因为它是如何生成工作的 - 可扩展性 - 用于同样事情的未来类。这可能是EmailExecutor.registerSenderFault
,这是你声明的大写的完整类。
肯定应该是以小写字母开头的服务通知。
myObjectServive.doStuff(stuff)
如果以上是MyObject
中的某种实际方法且不是static
方法,那么您需要instantiate
该类
MyObject myObject = new MyObject()
myObject.doStuff(stuff)
但简而言之,这就是服务存在的原因,因为它们只是被注射所以可以帮助你省去所有麻烦。
我建议你做一些环顾四周的阅读
<强> E2A 强>
def doStuff = {
println "my params are $params "
//do you see keyId in there ?
//if so what is doStuff expecting as input a string ?:
// since if you do
println "${params.keyId.getClass()}"
//by default it will be a string you may need to change it from:
//myObjectService.doStuff("${params.keyId}")
myObjectService.doStuff(params.keyId as Long)
}
我个人认为这不是上面编辑过的评论,但它仍然与你注射的方式/内容有关。我见过类似的问题。我建议你创建一个全新的服务并注入新服务作为测试并重新开始 - 不相信你正确地注入它或者如果你是服务可能是一些abstract class
而不是正常服务。或者......你在服务名称的大写/小写声明中犯了某种形式的类似错误,所以你可能已经创建了:
MyObjectnameService
并使用myObjectNameService
中N
的差异来调用它们,或者......更糟糕的是,您使用小写名称创建了myObjectNameService
的实际服务。
使用更简单的命名约定再次测试这一切,并创建一个新服务作为测试
grails create service MyService
然后再次尝试使用此服务