2017-10-11 1 views
2

In MVC, wenn wir ein Modell auf eine Aktion geben wir die folgende, um zu validieren, um das Modell für die Daten Kommentierung dieses Modells haben:ASP.NET-Core - Individuelle Modellvalidierung

if (ModelState.IsValid) 

Wenn wir eine Markierung Eigenschaft als [Erforderlich], validiert ModelState.IsValid diese Eigenschaft, wenn sie einen Wert enthält oder nicht.

Meine Frage: Wie kann ich benutzerdefinierte Validator manuell erstellen und ausführen?

P.S. Ich spreche nur vom Backend-Validierer.

Antwort

4

In .NET-Core, können Sie einfach eine Klasse erstellen, die von ValidationAttribute erbt. Sie können die vollständigen Details im ASP.NET Core MVC Docs sehen.

Hier ist das Beispiel direkt aus der Dokumentation entnommen:

public class ClassicMovieAttribute : ValidationAttribute 
{ 
    private int _year; 

    public ClassicMovieAttribute(int Year) 
    { 
     _year = Year; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     Movie movie = (Movie)validationContext.ObjectInstance; 

     if (movie.Genre == Genre.Classic && movie.ReleaseDate.Year > _year) 
     { 
      return new ValidationResult(GetErrorMessage()); 
     } 

     return ValidationResult.Success; 
    } 
} 

ich das Beispiel angepasst habe clientseitige Validierung auszuschließen, wie es in Ihrer Frage angefordert.

Um dieses neue Attribut zu verwenden (wieder von der docs genommen), müssen Sie es auf das entsprechende Feld hinzuzufügen: um sicherzustellen, dass ein Wert true ist

[ClassicMovie(1960)] 
[DataType(DataType.Date)] 
public DateTime ReleaseDate { get; set; } 

Hier ist ein weiterer, einfacheres Beispiel:

public class EnforceTrueAttribute : ValidationAttribute 
{ 
    public EnforceTrueAttribute() 
     : base("The {0} field must be true.") { } 

    public override bool IsValid(object value) => 
     value is bool valueAsBool && valueAsBool; 
} 

Dies wird in gleicher Weise angewandt:

[EnforceTrue] 
public bool ThisShouldBeTrue { get; set; } 
2

Um ein benutzerdefiniertes Validierungsattribut in .Net Core zu erstellen, müssen Sie von IModelValidator erben und die Methode Validate implementieren.

Individuelle Validator

public class ValidUrlAttribute : Attribute, IModelValidator 
{ 
    public string ErrorMessage { get; set; } 

    IEnumerable<ModelValidationResult> Validate(ModelValidationContext context) 
    { 
     var url = context.Model as string; 
     if (url != null && 
      Uri.IsWellFormedUriString(url, UriKind.Absolute)) 
     { 
      return Enumerable.Empty<ModelValidationResult>(); 
     } 

     return new List<ModelValidationResult> 
     { 
      new ModelValidationResult("", ErrorMessage) 
     }; 
    } 
} 

Das Modell

public class Product 
{ 
    public int ProductId { get; set; } 

    [Required] 
    public string ProductName { get; set; } 

    [Required] 
    [ValidUrl] 
    public string ProductThumbnailUrl { get; set; } 
}