2012-04-02 7 views
7

En la página que estoy desarrollando tengo un campo "Correo electrónico" y el campo "Confirmar correo electrónico". Y el requisito es tener una comparación insensible a mayúsculas y minúsculas.MVC 3 - Comparar atributo - Realizar la comparación de caso insensible en el lado del cliente

Podría crear un atributo personalizado y extender el comportamiento del atributo 'Comparar' que está incorporado. Esto funciona en el lado del servidor.

Pero no pude lograrlo en el lado del cliente. Estoy seguro de que tenemos que hacer algunas cosas adicionales para hacer que el jquery discreto haga una comparación insensible a mayúsculas y minúsculas.

+0

¿Ha considerado la validación a distancia? De lo contrario, puede estar atascado escribiendo un atributo de validación, y CompareAttribute es uno de los más feos. –

+0

sí. Esto parece una opción. Gracias. Pero, ¿hay alguna otra forma ?, para que pueda evitar esta llamada ajax adicional. – user979737

Respuesta

2

Puede utilizar el atributo en comparar MVC 3 ... que es una solución construida en ...

[Compare("Email",ErrorMessage="your error message")] 
    public string ConfirmEmail { get; set; } 

Actualización: mi mal, probablemente debería haber leído mejor a su pregunta ... de todos modos ... por la manera discreta de trabajar, después de crear un atributo (la versión de reemplazo de Comparar) ... necesitas hacer algo de trabajo de JavaScript para que la validación del lado del cliente no obstruida funcione ... aquí hay una publicación de blog de ejemplo unobtrusive client side validation with MVC 3 ... que hace algo similar a lo que estoy hablando ... si necesita más ayuda ... simplemente responder de nuevo ... Estaré encantado de ayudarle con esto ...

Aquí está un puesto más relevante ... que también habla de la creación de un atributo personalizado ... Creating Custom Validation Attribute (Server side and Client Side)

Espero que esto ayude ...

+0

Ese primer enlace está muerto – Liam

1

no estoy del todo seguro de lo que busca en cuanto al atributo Comparar, pero para el JavaScript, hará la comparación y podrá tomar medidas del cliente en función de los resultados.

if (email.toUpperCase() == confirmEmail.toUpperCase()) { 
    alert("Emails are a match!");   
} else { 
    alert("Emails do not match"); 
} 
0

Llegué un poco tarde a la fiesta, pero acabo de toparme con un problema similar. Esto se debe a un error en el archivo JavaScript javascript no intrusivo. Una versión posterior lo arreglará, me acabo de encontrar

Install-Package jQuery.Validation.Unobtrusive

que instaló v2, que funciona bien para mí. Su experiencia puede ser diferente.

Esta pregunta ha sido respondida correctamente here.

0

Para realizar una comparación insensible a las mayúsculas y minúsculas, puede crear su validador de comparación personalizado. Terminarás con esto.

public string Courriel { get; set; } 

    [EqualToIgnoreCase("Courriel", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "E00007")] 
    public string CourrielConfirmation { get; set;} 

Este es el ValidationAttribute:

/// <summary> 
/// The equal to ignore case. 
/// </summary> 
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] 
public class EqualToIgnoreCase : ValidationAttribute, IClientValidatable 
{ 
    #region Constructors and Destructors 
public EqualToIgnoreCase(string otherProperty) 
    { 
     if (otherProperty == null) 
     { 
      throw new ArgumentNullException("otherProperty"); 
     } 

     this.OtherProperty = otherProperty; 
    } 

    #endregion 

    #region Public Properties 

    public string OtherProperty { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get; private set; } 

    #endregion 

    #region Public Methods and Operators 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     ModelClientValidationRule compareRule = new ModelClientValidationRule(); 
     compareRule.ErrorMessage = this.ErrorMessageString; 
     compareRule.ValidationType = "equaltoignorecase"; 
     compareRule.ValidationParameters.Add("otherpropertyname", this.OtherProperty); 
     yield return compareRule; 
    } 

    #endregion 

    #region Methods 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     PropertyInfo basePropertyInfo = validationContext.ObjectType.GetProperty(this.OtherProperty); 

     IComparable valOther = (IComparable)basePropertyInfo.GetValue(validationContext.ObjectInstance, null); 

     IComparable valThis = (IComparable)value; 

     if (valOther.ToString().ToLower() == valThis.ToString().ToLower()) 
     { 
      return ValidationResult.Success; 
     } 
     else 
     { 
      return new ValidationResult("Error"); 
     } 
    } 

    #endregion 
} 

En el lado del cliente, tendrá que añadir esta sencilla inscripción:

var isEqualToIgnoreCase = function (value, element, param) { 
    return this.optional(element) || 
    (value.toLowerCase() == $(param).val().toLowerCase()); 
}; 

$.validator.addMethod("equaltoignorecase", isEqualToIgnoreCase); 
$.validator.unobtrusive.adapters.add("equaltoignorecase", ["otherpropertyname"], function (options) { 
    options.rules["equaltoignorecase"] = "#" + options.params.otherpropertyname; 
    options.messages["equaltoignorecase"] = options.message; 
}); 
Cuestiones relacionadas