Gå til indholdet

N242 Validering

Du skal skabe en tom konsol app med en klasse Person med følgende medlemmer:

  • En egenskab kaldet Fornavn (implementeret som en automatisk egenskab – brug ”prop” + tab)
  • En egenskab kaldet Efternavn (implementeret som en automatisk egenskab – brug ”prop” + tab)
  • En egenskab kaldet Email (string)
  • En egenskab kaldet Fødselsdato (DateTime)
  • En metode kaldet FuldtNavn som returnerer Fornavn + ” ” + Efternavn

Brug klassen i Main ved at skabe et objekt med new og test at det virker.

Når det virker, skal du installere FluentValidation i projektet:

dotnet add package FluentValidation

Opret en validatorklasse PersonValidator der arver fra AbstractValidator<Person> og tilføj følgende regler:

  • Fornavn: ikke tomt og må ikke indeholde tal (custom check)
  • Efternavn: ikke tomt
  • Email: ikke tomt og gyldig e-mail
  • Fødselsdato: skal være efter 1-1-1900 og før i dag

Til sidst: i Main skal I validere et par Person-objekter med forskellige (og med vilje forkerte) data og udskrive fejlene.

Klik for at se et forslag til en løsning
using FluentValidation;
using FluentValidation.Results;

var p = new Person
{
    Fornavn = "", // tomt for at trigge fejl
    Efternavn = "Olsen",
    Email = "invalid-email.dk",
    Fødselsdato = new DateTime(1810, 1, 1)
};

var validator = new PersonValidator();
ValidationResult result = validator.Validate(p);

if (!result.IsValid)
{
    foreach (var failure in result.Errors)
    {
        Console.WriteLine($"Property {failure.PropertyName} fejlede validering: {failure.ErrorMessage}");
    }
}
else
{
    Console.WriteLine("Person er gyldig");
}

// Klassen Person og arvinger
public class Person
{
    public string? Fornavn { get; set; }
    public string? Efternavn { get; set; }
    public string? Email { get; set; }
    public DateTime Fødselsdato { get; set; }

    public string? FuldtNavn()
    {
        return $"{Fornavn} {Efternavn}";
    }
}

// Validator
public class PersonValidator : AbstractValidator<Person>
{
    public PersonValidator()
    {
        RuleFor(x => x.Fornavn)
          .NotEmpty().WithMessage("Fornavn må ikke være tomt")
          .Must(name => !name.Any(char.IsDigit)).WithMessage("Fornavn må ikke indeholde tal");

        RuleFor(x => x.Efternavn)
          .NotEmpty().WithMessage("Efternavn må ikke være tomt");

        RuleFor(x => x.Email)
          .NotEmpty().WithMessage("Email må ikke være tom")
          .EmailAddress().WithMessage("Ugyldig e-mail adresse");

        RuleFor(x => x.Fødselsdato)
          .GreaterThan(new DateTime(1900, 1, 1)).WithMessage("Fødselsdato skal være efter 1-1-1900")
          .LessThan(DateTime.Now).WithMessage("Fødselsdato skal være i fortiden");
    }
}