我有一个模态对话框,我从gsp加载一个表单,我正在努力为基于ajax的表单找到合适的解决方案,其中包含
JSON验证.成功消息,如闪存范围消息:
$('#calendar_form').live('click',function () { $.modal({ ajax: './form',title: '${message(code:'calendar.main.addAppointment')}',overlayClose: true }); });
在那个表单中我有以下JS:
$(document).ready(function() { $('#form1').submit(function() { $.ajax({ type: 'POST',url: '${createLink(action:'post')}',data: $("#form1").serialize(),success: function(result) { alert(result); } }); }); });
我正在返回JSON响应,如果它成功并且发生错误时我需要Ajax,否则我的模态对话框由于新请求而消失.
所以这是我的问题:
>如何对我在控制器中验证期间发生的故障做出反应?
>我需要将哪些错误http代码用于控制器中的验证错误?
>如何使用表单中的错误消息更新特定字段?
>如何更新页面的flash部分以呈现成功消息?
>成功后如何更新页面的其他部分?
谢谢!
解决方法
有很多不同的方法可以实现这一点,可能还有一个或多个插件可以帮助您实现目标.但是,我会告诉你我一般如何处理这件事.我有一个看起来像这样的物体……
class AjaxPostResponse { boolean success String message String html def domainObject def errors = [:] }
这是我呈现为JSON的对象.因此,如果存在验证错误,则成功将变为false,并将所有错误添加到错误映射中.我在服务中执行此操作,该方法如下所示:
def preparePostResponse(domainInstance) { def g = grailsApplication.mainContext.getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib') def postResponse = new AjaxPostResponse(domainObject: domainInstance) if (domainInstance.hasErrors()) { g.eachError(bean: domainInstance) { postResponse.errors."${it.field}" = g.message(error: it) } postResponse.success = false postResponse.message = "There was an error" } else { postResponse.success = true postResponse.message = "Success" } return postResponse }
所以我的控制器看起来像
def save = { def someObjInstance = new SomeObj(params) someObjInstance.save(flush:true) render myService.preparePostResponse(someObjInstance) as JSON }
在我的客户端代码中,我做了类似的事情(使用jQuery表单插件,但这也适用于通用的$.ajax / $.post / $.get方法……
$(formElement).ajaxSubmit({ dataType: 'json',success: function(jsonData) { if (jsonData.success) { // do good stuff } else { // bad stuff happened showErrors(jsonData.errors); } } });
而我的showErrors功能
function showErrors(errors,element) { var errorList = $("<ul>"); for (field in errors) { errorList.append("<li>" + errors[field] + "</li>") $('input[name=' + field + ']').addClass('error'); } if (!element) { $(".errors").html("").append(errorList).show(500); } else { $(element).html("").append(errorList).show(500); } }
希望有所帮助.