2016-04-01 27 views
0

Ich habe zwei benutzerdefinierte Validierung, die die Validierung eines Modells durchführen. Der erste ist ein Steuerelement, das ich mache, um zu sehen, ob es Zeichen in der Zeichenfolge "<" und ">" gibt, das zweite ist zu sehen, ob zwei Daten aufeinanderfolgend sind.Benutzerdefinierte Validierung in ASP.NET MVC funktioniert nicht

Stützwinkel Validator

public class AngleBracketsValidator : ValidationAttribute 
{  
    public override Boolean IsValid(Object value) 
    { 


     Boolean isValid = true; 
     if (value != null && (value.ToString().Contains('<') || value.ToString().Contains('>'))) 
     { 
      isValid = false; 
     } 

     return isValid; 
    } 
} 

Datum Validator

public class CustomDateCompareValidator : ValidationAttribute 
{ 
    public String PropertyDateStartToCompare { get; set; } 

    public String PropertyDateEndToCompare { get; set; } 

    public CustomDateCompareValidator(string propertyDateStartToCompare, string propertyDateEndToCompare) 
    { 
     PropertyDateStartToCompare = propertyDateStartToCompare; 
     PropertyDateEndToCompare = propertyDateEndToCompare; 
    } 

    public override Boolean IsValid(Object value) 
    { 
     Type objectType = value.GetType(); 
     PropertyInfo[] neededProperties = 
      objectType.GetProperties() 
      .Where(propertyInfo => propertyInfo.Name == PropertyDateStartToCompare || propertyInfo.Name == PropertyDateEndToCompare) 
      .ToArray(); 

     if (neededProperties.Count() != 2) 
     { 
      throw new ApplicationException("CustomDateCompareValidator error on " + objectType.Name); 
     } 

     Boolean isValid = true; 
     if (Convert.ToDateTime(neededProperties[0].GetValue(value, null)) != Convert.ToDateTime("01/01/0001") && Convert.ToDateTime(neededProperties[1].GetValue(value, null)) != Convert.ToDateTime("01/01/0001")) 
     { 
      if (Convert.ToDateTime(neededProperties[0].GetValue(value, null)) > Convert.ToDateTime(neededProperties[1].GetValue(value, null))) 
      { 
       isValid = false; 
      } 
     }  
     return isValid; 
    } 
} 

Modell:

[Serializable] 
[CustomDateCompareValidator("DtStart", "DtEnd", ErrorMessage = "the start date is greater than that of the end.")] 
public class ProjModel 
{ 
    [Display(Name = "Codice:")] 
    [AllowHtml] 
    [AngleBracketsValidator(ErrorMessage = "Code can not contain angle bracket.")] 
    public string Code { get; set; } 

    [Display(Name = "Date Start:")] 
    public DateTime? DtStart { get; set; } 

    [Display(Name = "Date End:")] 
    public DateTime? DtEnd { get; set; } 

} 

den Tests bekannt Durchführen, dass der erste validator, dass die spitzen Klammern angezeigt wird, während die zweitens, das von Daten, wird angezeigt. Aber wenn ich einen fairen Wert innerhalb von Warteschlangen posten lasse und die Validierung von spitzen Klammern überlasse, wird die Fehlermeldung durch die Datumsvalidiereranzeige angezeigt. Einige Ideen, damit es richtig funktioniert?

+1

Bitte umformulieren Sie Ihre Frage. Es ist schwer zu verstehen, was eigentlich nicht funktioniert. – Mats

+0

Entschuldigung für mein schlechtes Englisch ... das Problem ist, dass ich nicht zwei Validatoren gleichzeitig anzeigen kann. –

+0

Sie wenden Ihren 'CustomDateCompareValidator' nicht auf die Klasse an. Sie wenden es auf eine Eigenschaft im Modell an - sagen Sie 'DtEnd' und geben Sie die andere Eigenschaft (' DtStart') zum Vergleichen an. Schlagen Sie vor, dass Sie ein [idiotensicheres] (http://foolproof.codeplex.com/) '[GreaterThan]' oder ein ähnliches Validierungsattribut verwenden, das Ihnen auch eine Validierung auf der Client-Seite ermöglicht. –

Antwort

0

"Dies wird nicht unterstützt. Wenn eine der Validierungen auf Eigenschaftsebene fehlschlägt, werden die Validierungen auf Klassenebene nicht durchgeführt". Betrachten Sie das Original entry

Verwandte Themen