2010-01-11 20 views
12

He leído Phil Haack's post en la validación de cliente personalizada en ASP.NET MVC 2. Quiero hacer lo mismo pero con el adaptador usando jQuery y ASP.NET MVC 2 RC (en contraposición a MVC Beta 2 que el puesto usos). ¿Alguien ha sido capaz de imaginar cómo hacer esto?Cómo escribir una validación jQuery personalizada del lado del cliente en ASP.NET MVC 2 RC?

especialmente me quieren implementar la validación de la contraseña correspondiente (es decir, la contraseña & confirmación de contraseña debe coincidir). La plantilla de proyecto ASP.NET MVC 2 RC VS.NET sí muestra cómo implementar que en el lado del servidor (utilizando el PropertiesMustMatchAttribute), pero no en el lado del cliente.

+0

Hay dos tipo de preguntas aquí: 1) ¿Cómo se hace la validación a nivel de modelo en el lado del cliente? 2) ¿Cómo ejecutas esa validación usando jQuery? Son preguntas interesantes. Es posible que desee actualizar el título de la pregunta para incorporar eso. (Estoy interesado en la respuesta al # 1, pero accidentalmente me encontré con esta pregunta.) –

Respuesta

15

Supongo que ya siguió las instrucciones de Phil Haack aquí http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx) sobre cómo obtener una validación personalizada trabajar con la validación del cliente MS AJAX. Para conseguir que funcione con jQuery, tendrá que modificar el archivo MicrosoftMvcJQueryValidation.js:

  • En la función __MVC_CreateRulesForField (validationField), que tendrá que añadir una declaración de caso. Continuando con el ejemplo de Phil, necesitará añadir:

    caso "precio":

    __MVC_ApplyValidator_Price (rulesObj, thisRule.ValidationParameters [ "min"]);

    break;

  • A continuación, necesita crear la función __MVC_ApplyValidator_Price:

función __MVC_ApplyValidator_Price (objeto, valor) {

// min is what jQuery Validate uses to validate for minimum values 
object["min"] = value; 

}

Eso debería ser suficiente para que Phil ejemplo trabajando.

Ahora, con respecto a su validación PropertiesMustMatchAttribute, que no se ve como MVC genera la definición de validación del lado del cliente JSON para los atributos que decoran las clases. Como PropertiesMustMatchAttribute se debe usar en el modelo (y no en la propiedad), no puedo entender cómo hacer que active la validación del lado del cliente. En cambio, tomé un enfoque diferente. Creé un atributo de validación ficticia cuya sobrecarga IsValid() siempre devuelve verdadero, y usé este atributo en una propiedad. Esto es solo un atributo ficticio que delegará la lógica de validación a la función equalTo del validador jQuery. Aquí está el atributo ficticio:

public class PropertiesMustMatchClientTriggerAttribute : ValidationAttribute 
{ 
    public string MatchProperty { get; set; } 

    public PropertiesMustMatchClientTriggerAttribute(string matchProperty) 
    { 
     MatchProperty = matchProperty; 
     ErrorMessage = "{0} doesn't match {1}."; 
    } 
    public override bool IsValid(object value) 
    { 
     return true; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, MatchProperty); 
    } 
} 

Aquí está el validador personalizado:

public class PropertiesMustMatchClientTriggerValidator : DataAnnotationsModelValidator<PropertiesMustMatchClientTriggerAttribute> 
{ 
    private string _message; 
    private string _matchProperty; 

    public PropertiesMustMatchClientTriggerValidator(ModelMetadata metaData, ControllerContext context, PropertiesMustMatchClientTriggerAttribute attribute) 
     : base(metaData, context, attribute) 
    { 
     _message = attribute.FormatErrorMessage(metaData.DisplayName); 
     _matchProperty = attribute.MatchProperty; 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = _message, 
      ValidationType = "equalTo" 
     }; 
     rule.ValidationParameters.Add("matchField", _matchProperty); 

     return new[] { rule }; 
    } 
} 

el validador personalizado anterior tiene que estar registrado en Application_Start() por el blog de Phil:

DataAnnotationsModelValidatorProvider.RegisterAdapter (typeof (PropertiesMustMatchClientTriggerAttribute), typeof (PropertiesMustClickTriggerValidator));

Por último, es necesario modificar el MicrosoftMvcJQueryValidation.js:

  • Añadir la declaración de caso siguiente para __MVC_CreateRulesForField:

caso "equalTo":

__MVC_ApplyValidator_EqualTo (rulesObj, thisRule.ValidationParameters [ "matchfield"]);

break;

  • añadir esta función:

función __MVC_ApplyValidator_EqualTo (objeto, elemId) {

object["equalTo"] = document.getElementById(elemId); 

}

Ahora tiene que adjuntar el atributo de validación ficticia a una propiedad:

[PropertiesMustMatchClientTrigger("Password")] 
    public string ConfirmPassword { get; set; } 

Eso debería hacerlo.

La creación de este atributo ficticio es un poco feo, por lo que espero que alguien pueda encontrar una solución más elegante.

+0

Gracias por la respuesta elaborada. Lo intentaré y actualizaré el resultado más tarde. –

+0

Solo un seguimiento rápido sobre esto. Basado en la charla de Brad Wilson sobre C4MVC (http://www.viddler.com/explore/c4mvc/videos/24/), el equipo de MVC está considerando implementar la validación del lado del cliente para las anotaciones a nivel de modelo en MVC 3. Si lo hacen eso, este tipo de problema será mucho más fácil de resolver. –

+0

Finalmente probé tu solución y funciona como un encanto. ¡Muchas gracias! –

1

Así es como para agregar una validación de jQuery personalizado:

$.validator.addMethod("noSpaces", function(value, element) { 
    if ($(element).val().indexOf(" ") >= 0) { 
     return false; 
    } else { 
     return true; 
    } 
}, "Value must not contain spaces"); 
+0

¿Cómo se puede integrar ese método personalizado al motor de validación de ASP.NET MVC 2? –

+0

Basado en la publicación de Phil, el nombre solo debería hacerlo. Pero aún no lo he intentado. –

Cuestiones relacionadas