我正在尝试在Grails 3.3.4中使用Ajax调用来保存记录。我查看了其他帖子,但似乎没有一个解决方案对我有所帮助。
在Grails 3中不推荐使用远程标签,因此不会有任何选择。我还需要获取所有表单字段,而不是单个文本框。但是似乎我的表单数据没有传递出去。有什么想法吗?
提交表单时,出现以下错误:
错误500:内部服务器错误
URI / user / saveAjax
groovy.lang.MissingMethodException类
消息为空
由无签名引起 方法: com.vogella.grails.guestbook。$ UserServiceImplementation.save()是 适用于参数类型: (grails.web.servlet.mvc.GrailsParameterMap)值:[[controller:user, 格式:null,操作:saveAjax]]可能的解决方案: 保存(com.vogella.grails.guestbook.User),wait(),any(),wait(long), any(groovy.lang.Closure),isCase(java.lang.Object)
域
package com.vogella.grails.guestbook
class User {
String name
String last
static constraints = {
name (blank:false, nullable:false, size:3..30, matches:"[a-zA-Z1-9_]+")
}
String toString(){
return name;
}
}
控制器
package com.vogella.grails.guestbook
import grails.validation.ValidationException
import static org.springframework.http.HttpStatus.*
class UserController {
UserService userService
static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
static scaffold = User
def saveAjax(params) {
render params
userService.save(params)
render "Success!"
}
}
GSP
<!doctype html>
<html>
<head>
<meta name="layout" content="main"/>
<title>Welcome to Grails</title>
<g:javascript library='jquery' />
</head>
<body>
<g:form id = "my_awesome_form">
<g:textField id = "box1" name="mytextbox"/>
<g:textField id = "box2" name="mytextbox2"/>
<input type="button" id = "mybutton" onclick="changeName()" value="create user"/>
</g:form>
<div id="resultDiv"></div>
<script>
function changeName()
{ event.preventDefault();
$.ajax({
url:"<g:createLink url="[action:'saveAjax',controller:'User']" />",
dataType: "json",
type:"post",
data: $('#my_awesome_form').serialize(),
success: function() {
$( "#resultDiv" ).addClass( 'alert alert-info' ).append( 'Successfully saved event' )
},
error: function(xhr, status, error) {
$( "#resultDiv" ).addClass( 'alert alert-info' ).append(xhr.responseText);
}
});
}
</script>
</body>
</html>
通过
传递数据时尝试调用params.box1时$('#my_awesome_form')。serialize();
我收到:
由方法歧义导致的方法重载 grails.artefact.controller.support.ResponseRenderer $ Trait $ Helper#render。 无法解析为[class调用的方法 com.vogella.grails.guestbook.UserController,null]由于重叠 原型之间:[接口 grails.artefact.controller.support.ResponseRenderer,接口 java.lang.CharSequence] [接口 grails.artefact.controller.support.ResponseRenderer,接口 java.util.Map]
答案 0 :(得分:0)
该错误表明您正在将映射params
传递给userService save
对象的User
方法,您可以更改userService save
方法的实现,使其接受地图或像这样通过地图:
userService.save( new User( params ) )
这假设表单中的字段ID与User
域中的字段名称匹配,因此Grails可以bind them(如果不更改它们以匹配)(容易得多),否则您将不得不手动将它们设置为:
def user = new User()
user.name = params.box1
...