Grails JQuery Ajax表单验证

我有一个模态对话框,我从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);
    }
}

希望有所帮助.

相关文章

页面搜索关键词突出 // 页面搜索关键词突出 $(function () {...
jQuery实时显示日期、时间 html: &lt;span id=&quot...
jQuery 添加水印 &lt;script src=&quot;../../../.....
中文:Sys.WebForms.PageRequestManagerParserErrorExceptio...
1. 用Response.Write方法 代码如下: Response.Write(&q...
Jquery实现按钮点击遮罩加载,处理完后恢复 思路: 1.点击按...