2016-08-07 32 views
0

Gibt es eine Möglichkeit zum Auslösen des Datenanmerkung nur vergleichen, wenn das Feld nicht leer ist? Wenn nicht, was ist ein anderer Weg, es zu tun?MVC E-Mail vergleichen, wenn das Bestätigungsfeld nicht leer ist

Dieser Code löst immer die Datenanmerkung aus, unabhängig davon, ob er einen Wert enthält oder nicht.

[EmailAddress] 
[Required] 
[Display(Name = "Email Address")] 
public string EmailAddress { get; set; } 

[Display(Name = "Confirm Email Address")] 
[Compare("EmailAddress", ErrorMessage = "The email addresses do not match.")] 
public string ConfirmEmailAddress { get; set; } 
+0

Bitte beachten Sie, dass der Model-View-Controller-Tag ist für Fragen zum Muster. Es gibt ein bestimmtes Tag für die ASP.NET-MVC-Implementierung. –

+0

@StephenMücke. Oh okay ... Ich sehe, du hast die Tags schon bearbeitet. Erwischt. –

Antwort

1

Es könnte am einfachsten sein, nur das Attribut mit Ihrem eigenen erweitern:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public sealed class CompareEnhancedAttribute : CompareAttribute 
{ 
    public bool AllowEmptyStrings { get; set; } 

    public CompareEnhancedAttribute(string otherProperty) 
     : base(otherProperty) 
    { 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (AllowEmptyStrings && string.IsNullOrEmpty(value?.ToString())) 
     { 
      return ValidationResult.Success; 
     } 
     else 
     { 
      return base.IsValid(value, validationContext); 
     } 
    } 
} 

dann verwenden, etwa so:

public sealed class ContactModel 
{ 
    /* omitted other attributes */ 

    public string EmailAddress { get; set; } 

    [CompareEnhanced("EmailAddress", AllowEmptyStrings = true)] 
    public string ConfirmEmailAddress { get; set; } 
}