Validador jQuery y una regla personalizada que usa AJAX

Leí su respuesta con respecto al validador de jQuery donde describe un método para verificar un nombre de usuario contra un valor en una base de datos.

He intentado implementar este método, pero no importa lo que devuelva el archivo PHP, siempre recibo el mensaje de que el nombre de usuario ya está tomado.

Aquí está el método personalizado …

$.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"); 

Y aquí está el código de validación …

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

¿Hay alguna manera específica en que se supone que debo devolver el mensaje de php?

Gracias

UN

Usted está haciendo una solicitud AJAX, ergo: la validación ya ha finalizado cuando su validador personalizado devuelve verdadero o falso.

Necesitarás trabajar con async . Ver también esta publicación: ¿Cómo puedo obtener jQuery para realizar una solicitud Ajax sincrónica, en lugar de asincrónica?

Algo como:

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

Advertencia:

A partir de jQuery 1.8, el uso de async: false con jqXHR ($ .Deferred) está en desuso; debe usar las opciones de éxito / error / callback completa en lugar de los métodos correspondientes del objeto jqXHR como jqXHR.done () o el jqXHR.success () en desuso.

Para cualquier otra persona que tropiece con esto, valida el método ‘remoto’ de soportes, que puede no haber existido en 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(); } } } } } }); 

Me llevó mucho tiempo descubrir cómo obtener una cadena jsonificada que contenga el valor de un elemento de la página en la solicitud remota; este es el resultado de una combinación de muchas horas y de intentar muchos resultados de búsqueda.

Puntos clave:

  1. async:false ha quedado obsoleto,
  2. la llamada a la función justo después del remote: es la clave para crear la cadena de datos con el valor del elemento. Intentando acceder a un valor actual desde el formulario después de los data: devolvía un valor en blanco para el campo con dataType establecido como 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" } }); 

.Página de ASPX:

  

C # Code Behind:

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

Formateando el objeto de respuesta:

 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; };