none
Impedir que o usuário digite várias vezes o mesmo registro no cadastro em ASP.NET MVC Core 2.0 com SQL Server RRS feed

  • Pergunta

  • Tenho uma aplicação ASP.NET MVC Core 2.0 usando banco de dados SQL Server. Tenho um cadastro básico de combustíveis. Exemplo: Alcool, Gasolina, Diesel, etc...

    Quero impedir que o usuário grave dois registros duplicados, por exemplo Alcool mais de uma vez no banco.

    Estou tentando por DataAnnotations marcar o campo como Unique, que dai o banco não aceitaria esse registro duplicado. Essa seria minha primeira opção.

    Minha segunda opção, na Controller de Combustiveis criei uma validação se o Combustível já foi registrado, mas não consegui ainda mostrar a mensagem na tela de cadastro. O registro não é salvo, mas não mostra nenhuma mensagem para o usuário.

    Podem me ajudar a restringir esse registro duplicado? Mesmo que seja uma opção diferente das que coloquei acima, o importante seria mostrar uma mensagem para o usuário e impedir essa duplicidade de cadastro.

    sexta-feira, 3 de agosto de 2018 13:34

Respostas

  • Conseguir fazer usando ModelState.AddModelError

    [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> Create([Bind("Id,Nome")] Combustivel combustivel)
            {
                if (_context.Combustivel.Any(c => c.Nome == combustivel.Nome))
                {
                    ModelState.AddModelError("Nome", $"Esse Combustível já está registrado.");
                }            

                if (ModelState.IsValid)
                {
                    combustivel.Id = Guid.NewGuid();
                    _context.Add(combustivel);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }
                return View(combustivel);
            }

    sexta-feira, 3 de agosto de 2018 16:31

Todas as Respostas

  • Conseguir fazer usando ModelState.AddModelError

    [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> Create([Bind("Id,Nome")] Combustivel combustivel)
            {
                if (_context.Combustivel.Any(c => c.Nome == combustivel.Nome))
                {
                    ModelState.AddModelError("Nome", $"Esse Combustível já está registrado.");
                }            

                if (ModelState.IsValid)
                {
                    combustivel.Id = Guid.NewGuid();
                    _context.Add(combustivel);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }
                return View(combustivel);
            }

    sexta-feira, 3 de agosto de 2018 16:31
  • Rodolfo, boa tarde!

    A resolução desse problema é: Depende do cenário.

    Se você tem um usuário com dedo "Nervoso", Você pode controlar via Javascript e também server side.

    Html:

    <form ...>
    <input ...>
    <button ... onclick="this.disabled=true;this.value='Submitting...'; this.form.submit();">
    </form>

    E no server, utilize o exemplo acima.

    Em cenários em que muitos usuários acessam a app e podem fazer a mesma ação, você teria que partir para sistemas de mensageria como o RabbitMQ ou Azure Service Bus

    Refêrencias

    Azure Service Bus Queues

    RabbitMQ Hello World


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    sexta-feira, 3 de agosto de 2018 17:47