jQueryvalidation器和使用AJAX的自定义规则

我读了你的回复关于jQueryvalidation程序,在那里你概述了一个方法来检查数据库中的值的用户名。

我试着实现这个方法,但不pipe从PHP文件返回什么我总是得到消息,用户名已被采取。

这是自定义方法…

$.validator.addMethod("uniqueUserName", function(value, element) { $.ajax({ type: "POST", url: "php/get_save_status.php", data: "checkUsername="+value, dataType:"html", success: function(msg) { // if the user exists, it returns a string "true" if(msg == "true") return false; // already exists return true; // username is free to use } })}, "Username is Already Taken"); 

这里是validation码…

 username: { required: true, uniqueUserName: true }, 

有没有一种特定的方式,我应该从PHP返回消息。

谢谢

一个

你正在做一个AJAX请求,ergo:当你的自定义validation器返回true或false时,validation已经完成。

您将需要使用async 。 另请参阅这篇文章: 我如何让jQuery执行同步而不是asynchronous的Ajax请求?

就像是:

 function myValidator() { var isSuccess = false; $.ajax({ url: "", data: {}, async: false, success: function(msg) { isSuccess = msg === "true" ? true : false } }); return isSuccess; } 

警告:

从jQuery 1.8开始,不赞成使用带有jqXHR($ .Deferred)的async:false; 您必须使用成功/错误/完整callback选项,而不是jqXHR对象的相应方法(如jqXHR.done()或不赞成使用的jqXHR.success()。

对于其他任何人而言,validation支持2010年可能不存在的“远程”方法:

http://docs.jquery.com/Plugins/Validation/Methods/remote

 $("#myform").validate({ rules: { email: { required: true, email: true, remote: { url: "check-email.php", type: "post", data: { username: function() { return $("#username").val(); } } } } } }); 

我花了很长时间才弄清楚如何将包含页面中元素值的jsonifiedstring转换为远程请求 – 这是多个小时的组合并尝试许多search结果的结果。

关键点:

  1. async:false已被弃用,
  2. 调用remote:后的函数remote:是用元素的值创build数据串的关键。 尝试从data:之后的表单中访问当前值data:dataType设置为json的字段返回空值。

      $("#EmailAddress").rules("add", { required: true, remote: function () { // the function allows the creation of the data string // outside of the remote call itself, which would not // return a current value from the form. var emailData = "{'address':'" + $('#SignupForm :input[id$="EmailAddress"]').val() + "'}"; var r = { url: "foobar.aspx/IsEmailAvailable", type: "post", dataType: "json", contentType: "application/json; charset=utf-8", cache: false, data: emailData, dataFilter: function(response) { this.email_run = true; //fix for race condition with next button return isAvailable(data); //return true or false } }; return r; }, messages: { remote: "* Email in use" } }); 

.ASPX页面:

 <input id="EmailAddress" required name="Email" type="email" placeholder="Email Address*" runat="server"/> 

C#代码背后:

 [WebMethod] public static object IsEmailAvailable(string address){...} 

格式化响应对象:

 function isAvailable(data) { var response = JSON.parse(getJsonObject(data)); return (response.isAvailable === "True") ? true : false; }; //transform response string to a JavaScript Object() //http://encosia.com/never-worry-about-asp-net-ajaxs-d-again/ function getJsonObject(data) { var msg = eval('(' + data + ')'); if (msg.hasOwnProperty('d')) return msg.d; else return msg; };