Grails - 将数据从视图传递到控制器

时间:2017-01-10 17:24:50

标签: grails view parameters controller

我正在尝试将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数据?

谢谢!

1 个答案:

答案 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并使用myObjectNameServiceN的差异来调用它们,或者......更糟糕的是,您使用小写名称创建了myObjectNameService的实际服务。

使用更简单的命名约定再次测试这一切,并创建一个新服务作为测试

grails create service MyService

然后再次尝试使用此服务