Executando verificação de segurança...
2

Validações no C#/ASP NET

Bom dia pessoas, tudo bem? Espero que sim. Estou trabalhando em APIs com C# mais especificamente asp net 4.7, e eu gostaria de saber se preciso ou como fazer algumas validações dentro da minha controller, por exemplo: A Model de usuario tem nome, email, e cpf.

Nesse caso pra mim existem alguns problemas como: Cpf pode estar null ou com uma string com espaço (" ") então o certo é fazer 2 validações para o CPF? ou o Asp net valida pra mim caso o valor não seja númerico.

Então pensando nisso, eu preciso fazer 3 ifs cada um verificando se os atributos estão preenchidos ou o asp net faz isso pra mim?

Isso tudo que perguntei depende de versão? Porque eu lembro de ter feito uma API em asp net core e ter esse tipo de validação, mas gostaria de uma certeza sobre esse assunto. Perdoem caso tenho feito a pergunta mal feita ou que ela tenha ficada confusa, não sou muito com Fóruns.

Obrigado pela atenção!

OBS: Não coloquei aqui que o CPF tem que ser válido porque isso seria uma validação que eu já sei que preciso fazer.

Segue um exemplo de código:

[HttpPost]
        [Route("gravar")]
        public async Task<IHttpActionResult> GravarTerceiroAutorizado(Usuario model)
        {
            
            
            if (model.CPF != null)
            {
                return BadRequest("O CPF fornecido é inválido.");
            }

            try
            {
                var retorno = await _usuarioService.GravarUsuario(model);

                if(retorno == "Gravou")
                    return Ok(new { message = "Usuario cadastrado com sucesso." });
                else
                    return Ok(new { message = "Autorização do terceiro editada com sucesso." });
            }
            catch (Exception ex)
            {
                return BadRequest($"Desculpe, ocorreu um erro ao processar sua solicitação: {ex.Message}");
            }
        }
Carregando publicação patrocinada...
1

Valida em uma só verificação, usando

if (string.IsNullOrEmpty(model.CPF.ToString().Trim())) {
return BadRequest("O CPF fornecido é inválido.");
}

1
1

Isso vai depender muito da estrutura que vc está usando...

tenho projetos que crio uma classe de Validator para cada Entidade... dessa forma, a lógica de validação fica explícita nessa classe mas não polui minhas controllers.

O .NET permite q vc use Data Annotations para fazer a validação das suas classes, como nesse exemplo aqui:
https://learn.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

Vc pode tbm usar o FluentValidation para isso:
https://docs.fluentvalidation.net/en/latest/

Enfim, tem muitas formas de se fazer a mesma coisa... mas a mais simples seria colocar os if's diretamente mesmo... coisa q eu não recomendo!

1

Entendi, é colocar 11 ifs dentro da controller é bem paia mesmo. Vou até repetir a perguntar sobre o asp net conseguir fazer isso automatico, você sabe se ele consegue? Eu preciso fazer alguma configuração ou algo do tipo?

1

Olá VitorPhantomhive

Existem algumas maneira, uma delas é utilizar os DataAnnotations
ex:

        public class Usuario
        {
            public string Nome { get; set; }
            public string Email { get; set; }
            [Required(ErrorMessage = "CPF é obrigatorio")]
            [StringLength(11, MinimumLength = 11, ErrorMessage = "Cpf deve conter 11 caracteres")]
            public string Cpf { get; set; }
        }
        
        [HttpPost]
        public IActionResult Post(Usuario usuario)
        {
            // o aspnet estará validando automaticamente para você e entregando o resultado no ModelState
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            return Ok(usuario);
        }

Outra maneira bastante usada é com FluentValidation

1
1

você diz não ser necessario o if (!ModelState.IsValid)... ?

É possivel e bem simples, apenas adicionando o atributo [ApiController] ele irá fazer essa autovalidação

ex:

[ApiController]
[Route("[controller]")]
public class UsuarioController : ControllerBase
{
    [HttpPost]
    public IActionResult Post(Usuario usuario)
    {
        return Ok(usuario);
    }
1