2011-11-17 7 views
5

Tengo un senario en el que debo verificar la existencia de un nombre de usuario en la base de datos mientras realizo una página de registro. Para esto he implementado un atributo remoto para la validación remota en mi modeloAdición de demora al atributo de validación remota MVC3

[Remote("CheckUserNameAvaliable", "User", Httpmethod="Post")] 
public string Username {get; set;} 

y mi método se parece a esto

[HttpPost] 
public JsonResult CheckUserNameAvaliable(string UserName) 
{ 
    SessionUser currentUser = this.sessionHelper.GetCurrentUser(); 
    User user = this.userService.GetByUsername(UserName); 
    if (user != null && user.Id != currentUser.Id) 
    { 
     return Json(false); 
    } 

    return Json(true); 
} 

Funciona bien para mí, pero el problema es que cada vez que hicimos una clave en el nombre de usuario de Textbox se archivará esta validación remota, pero de acuerdo con mis requisitos tengo que activar esta validación remota solo después de ingresar el valor en el nombre de usuario Textbox. ¿Para eso podemos agregar un retraso al atributo de validación remota?

¿Alguien sabe cómo agregar retraso a la validación remota en MVC3?

Respuesta

2

He estado atrapado en problemas similares antes con MVC3 y validación remota. Supongo que se desea que el evento se disparó en la falta de definición pero no sabe cómo te diría que la validación remota ..

Esperamos que esto ayudará

ASP.NET Remote Validation only on blur?

+0

La respuesta es buena, pero el problema es que se está configurando a nivel mundial, pero si quiero especificarlo en una página específica, entonces es bastante extraño, creo. –

+1

Puedes ponerlo en el selector: $ (". Selector"). Validate ({onkeyup: false}); –

0

Si no desea validar el keyup sino en la falta de definición a continuación this es lo que quiere

+0

respuesta es buena, pero el problema es que se está configurando globalmente, pero si quiero especificarlo solo en una página específica, entonces es bastante extraño, creo. –

3

MVC3 utiliza el plugin en el navegador jquery.validate . Con jquery.validate, la validación del campo no comienza hasta el primer cambio y desenfoque del campo, o al enviar si el campo no fue tocado.

Una vez que se inicia la validación de campo para un campo, la configuración onkeyup del validador controla si la validación se realiza en cada evento de tecla. Si está realizando una validación remota en un campo con cada pulsación de tecla, probablemente envíe demasiados mensajes ajax, destacando tanto al cliente como al servidor.

Como mencionaron los otros respondedores, puede suprimir la validación de teclado configurando validator.settings.onkeyup = false, pero eso suprime la validación onkeyup en todos los campos de formulario, no solo en aquellos con una regla de validación remota. Lo que sugiero es que suprima la tecla mientras que el campo con validación remota tiene el foco y luego vuelva a encenderlo cuando borre el campo.

Suprimir onkeyup es fácil. El problema es que cambiar la configuración de falso a verdadero no vuelve a activar la función. Para volver a encenderlo, debe establecerlo en la función definida en los valores predeterminados del objeto $ .validator.

Aquí está el código de javascript para incluir en su página si está utilizando la validación discreta de MVC. Cubrirá todos los formularios en su página. Y asegúrese de utilizar la versión 1.9.0 o posterior jquery.validate porque las versiones anteriores no funcionan correctamente con Internet Explorer 7 o 8 (sí, tengo que apoyar a aquellos usuarios también):

$("form input[data-val-remote-url]").on({ 
     focus: function() { 
      $(this).closest('form').validate().settings.onkeyup = false; 
     }, 
     blur: function() { 
      $(this).closest('form').validate().settings.onkeyup = 
       $.validator.defaults.onkeyup; 
     } 
    }); 
Cuestiones relacionadas