2012-04-02 9 views
7

Nella pagina che sto sviluppando ho un campo "Email" e un campo "ConfirmEmail". E il requisito è avere un confronto tra maiuscole e minuscole.MVC 3 - Confronta attributi - Esegui confronto senza distinzione tra maiuscole e minuscole dal lato client

Potrei creare un attributo personalizzato ed estendere il comportamento dell'attributo 'Confronta' che è integrato. Funziona sul lato server.

Ma non sono stato in grado di ottenerlo dal lato client. Sono sicuro che dobbiamo fare alcune cose aggiuntive per fare in modo che il jQuery non invadente faccia un confronto senza distinzione tra maiuscole e minuscole.

+0

Avete considerato la validazione a distanza? Altrimenti potresti rimanere bloccato scrivendo un attributo di validazione, e CompareAttribute è uno dei più brutti. –

+0

sì. Questa sembra un'opzione. Grazie. Ma c'è un altro modo ?, Così posso evitare questa chiamata ajax aggiuntiva. – user979737

risposta

2

È possibile utilizzare l'attributo confrontare in MVC 3 ... che è una costruito in soluzione ...

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

Aggiornamento: mio male, probabilmente avrei dovuto leggere la tua domanda migliore ... comunque ... per il modo discreto di lavorare, dopo aver creato un attributo (la versione override di Compare) ... devi fare del lavoro javascript per la convalida lato client non invadente per lavorare ... ecco un esempio di post sul blog unobtrusive client side validation with MVC 3 ... fa qualcosa di simile a quello di cui sto parlando ... se hai bisogno di ulteriore aiuto ... torna indietro ... Sarò felice di aiutarti con questo ...

Ecco un post più pertinente ... che parla anche di creare un attributo personalizzato ... Creating Custom Validation Attribute (Server side and Client Side)

Spero che questo aiuti ...

+0

Il primo link è morto – Liam

1

non ne sono del tutto certo che cosa state cercando per quanto riguarda l'attributo Confronto, ma per il JavaScript, questo farà il confronto e puoi agire dal cliente in base ai risultati.

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

Un po 'in ritardo per la festa, ma mi sono solo imbattuto in un problema simile. Questo è causato da un errore nel javascript file jQuery non ostruente. Una versione successiva lo risolverà, ho appena eseguito

Install-Package jQuery.Validation.Unobtrusive

che ha installato v2, che funziona bene per me. Il tuo chilometraggio può variare.

Questa domanda ha avuto una risposta corretta here.

0

Per eseguire confronti tra maiuscole e minuscole, è possibile creare il proprio comparatore di confronto personalizzato. Finirai con questo.

public string Courriel { get; set; } 

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

Questa è la 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 
} 

Sul lato client si dovrà aggiungere questo semplice registrazione:

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; 
}); 
Problemi correlati