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

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.
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);
}- Marcado como Resposta welington jrModerator terça-feira, 7 de agosto de 2018 11:21
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);
}- Marcado como Resposta welington jrModerator terça-feira, 7 de agosto de 2018 11:21
-
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
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