Validate form data with registration in the database

3

I am developing with ASP.NET MVC (I use ENTITIES / DAL / LOGIC - layers) and wanted to know better way to validate data form (website) form to be registered in the database? I have in the DAL layer (access to DB - SQL) this code:

 public void CriaRegisto(JogadorDTO jogadorDTO)
        {
            bd_AvesEntities baseDados = new bd_AvesEntities();
            tbJogadores tabelaJogador = new tbJogadores();

            tabelaJogador.NumeroCamisola = jogadorDTO.NumeroCamisola;
            tabelaJogador.Nome = jogadorDTO.Nome;
            tabelaJogador.Posicao = jogadorDTO.Posicao;
            tabelaJogador.Nacionalidade = jogadorDTO.Nacionalidade;
            tabelaJogador.DataNascimento = jogadorDTO.DataNascimento;
            tabelaJogador.Altura = jogadorDTO.Altura;
            tabelaJogador.Peso = jogadorDTO.Peso;
            tabelaJogador.ativo = jogadorDTO.ativo;
            tabelaJogador.UtilizadorCriacao = "";
            tabelaJogador.DataCriacao = DateTime.Now ;
            tabelaJogador.UtilizadorAlteracao = "";
            tabelaJogador.DataAlteracao = DateTime.Now ;

            baseDados.tbJogadores.Add(tabelaJogador);
            baseDados.SaveChanges();
        }

I needed a method to validate data that comes through the website form, type Checks if the data has been placed there:

public bool InsereDados(JogadorDTO jogadorDTO)
        {
            if (jogadorDTO.Nome == null)
                return false;
            if (jogadorDTO.Altura == 0)
                return false;
            if (jogadorDTO.ativo == false)
                return false;
            if (jogadorDTO.DataNascimento == null)
                return false;
            if (jogadorDTO.Nacionalidade == null)
                return false;
            if (jogadorDTO.NumeroCamisola == 0)
                return false;
            if (jogadorDTO.Peso == 0)
                return false;
            if (jogadorDTO.Posicao == null)
                return false;

            else

                return true;
        }

And now I need something that tells me that if those data are fake then you need to put them in the form with some kind of error msg. I thought something like:

public bool ValidarDados(JogadorDTO jogadorDTO, out string msg)

How can I do this?

    
asked by anonymous 24.05.2016 / 11:50

1 answer

3

PedroF, despite discarding your choice of architecture (% with% w /% w /% w /%), I'll try to help you with the validation.

first, make your entity in the Player case inherit from Entity Framework , then implement your validation rule in the Validate () method.

public class Jogador : IValidatableObject
{
    public string Nome { get; set; }
    public int Altura { get; set; }     
    public DateTime? DataNascimento { get; set; }
    public string Nacionalidade { get; set; }
    public int NumeroCamisola { get; set; }
    public int Peso { get; set; }
    public string Posicao { get; set; }
    public bool Ativo { get; set; }

    public IEnumerable<ValidationResult>(ValidationContext validationContext)
    {
        if (this.Nome == null)
            yield return new ValidationResult("Propriedade Nome é obrigatoria", new [] { "Nome" });
        if (this.Altura == 0)
            yield return new ValidationResult("Propriedade Altura é obrigatoria", new [] { "Altura" });            
        if (this.DataNascimento == null)
            yield return new ValidationResult("Propriedade DataNascimento é obrigatoria", new [] { "DataNascimento" });
        if (this.Nacionalidade == null)
            yield return new ValidationResult("Propriedade Nacionalidade é obrigatoria", new [] { "Nacionalidade" });
        if (this.NumeroCamisola == 0)
            yield return new ValidationResult("Propriedade NumeroCamisola é obrigatoria", new [] { "NumeroCamisola" });
        if (this.Peso == 0)
            yield return new ValidationResult("Propriedade Peso é obrigatoria", new [] { "Peso" });
        if (this.Posicao == null)
            yield return new ValidationResult("Propriedade Posicao é obrigatoria", new [] { "Posicao" });
        if (this.Ativo == false)
            yield return new ValidationResult("Propriedade Ativo é obrigatoria", new [] { "Ativo" });
    }
}

In the example above, as we are only checking if the field was filled out, we would ideally use DataAnnotations, so the implementation below would also be valid:

public class Jogador : IValidatableObject
{
    [Required(ErrorMessage = "Propriedade Nome é obrigatoria")]
    public string Nome { get; set; }

    [Required(ErrorMessage = "Propriedade Altura é obrigatoria")]
    [Range(100, 250, ErrorMessage = "Altura deve ser maior que 1.00 e menor que 2.50")]
    public int Altura { get; set; }

    [Required(ErrorMessage = "Propriedade DataNascimento é obrigatoria")]
    public DateTime? DataNascimento { get; set; }

    /* Outras Validacoes */

    public IEnumerable<ValidationResult>(ValidationContext validationContext)
    {
        var results = new List<ValidationResult>();
        Validator.TryValidateProperty(this.Nome,
            new ValidationContext(this, null, null) { MemberName = "Nome" },
            results);
        Validator.TryValidateProperty(this.Altura,
            new ValidationContext(this, null, null) { MemberName = "Altura" },
            results);
        Validator.TryValidateProperty(this.DataNascimento,
            new ValidationContext(this, null, null) { MemberName = "DataNascimento" },
            results);

        /* Demais Validações */

        if (this.DataNascimento.HasValue && (this.DataNascimento.Value.Year < 1900 || this.DataNascimento.Value.Date > DateTime.Today))
            results.Add(new ValidationResult("Propriedade DataNascimento é invalida", new [] { "DataNascimento" }));

        /* Demais Validações */

        return results;
    }
}

Validation is performed automatically when calling SaveChanges ();

//Input.: DataNascimento = 01/01/1800 (Data Invalida)
public static void CriaRegisto(JogadorDTO jogadorDTO) 
{
    var tabelaJogador = Mapper<Jogador>(jogadorDTO);
    using (var baseDados = new bd_AvesEntities())
    {
        baseDados.tbJogadores.Add(tabelaJogador);
        baseDados.SaveChanges(); //Validation Exception
    }
}

If you prefer, you can also call the Repository Pattern

//Input.: DataNascimento = 01/01/1800 (Data Invalida)
public static IEnumerable<ValidationResult> CriaRegisto(JogadorDTO jogadorDTO) 
{
    var tabelaJogador = Mapper<Jogador>(jogadorDTO);
    using (var baseDados = new bd_AvesEntities())
    {
        baseDados.tbJogadores.Add(tabelaJogador);
        var erros = baseDados.GetValidationErrors();
        if (!erros.Any()) 
        {
            baseDados.SaveChanges();
        }
        return erros;       
    }
}

In your presentation layer, if you are using DAL , since you are using IValidatableObject as the Model, .GetValidationErrors() will not auto-validate, so you will have to add ASP.NET MVC to your DTO .

To display errors on the page, just use JogadorController , for example:

<div>
    @Html.LabelFor(model => model.Nome)
</div>
<div>
    @Html.EditorFor(model => model.Nome)
    @Html.ValidationMessageFor(model => model.Nome)
</div>

If you are using other technology in your presentation layer, you will need to decide how best to display ValidationResult to the User.

    
24.05.2016 / 13:54