C# MVC — Action Única para Inserir e Atualizar Registro
Marlon Tiedt
Posted on April 2, 2024
A ideia para esta postagem, surgiu quando em um grupo de discussão de C# no WhatsApp foi feita a pergunta:
Pessoal estou estudando o Asp.Net MVC e eu tenho um sistema de consorcio onde a tela de cadastro de Cota é bem complexa, o exemplo que vejo em MVC sempre tem uma tela de inclusão,alteração e exclusão.
No meu caso uso uma que faz todo o processo. Como seria isto no MVC?
Basicamente todos os exemplos de CRUD, utilizam uma Action para inserir, outra para editar e outra para excluir.
A maioria das vezes, a Action para inserir e editar, possuem os mesmos campos e regras de negócio, gerando assim código duplicado e com maior manutenção.
Porém, se existir regras distintas para inserção e edição do registro, as regras podem ser criadas e validadas em BO (Business Objects, mas isto falarei em outro post).
Para reaproveitar a tela existe várias formas. Vou mostrar utilizando uma Action única para inserir e detalhar irei chamar ela de Cadastro.
public ActionResult Cadastro(int? id)
{
if (id != null)
{
using (var db = new Conexao())
{
var registro = db.Pessoa.Find(id);
return View(registro);
}
}
return View();
}
Basicamente se ela receber um id na URL, irá buscar o registro e devolver para a View o registro.
A View não tem muito segredo (estou utilizando Razor).
No inicio da View verifico se foi passado um registro válido (diferente de nulo) e se este tem a propriedade PessoaID diferente de 0 (se for zero indica que estamos inserindo um registro).
Se as duas condições forem válidas, estamos fazendo a edição de um registro. Então será setando a variável novoRegistro para false.
Se a variável é false, adicionamos o identificador PK do registro, para que no POST o Entity Framework entenda que é a edição de um registro e não a criação de um novo registro.
Além disto, a variável novoRegistro é utilizada para o controle dos botões que irão aparecer para o usuário.
@model site.Models.Pessoa
@{
var novoRegistro = true;
if (Model != null && Model.PessoaID != 0)
{
novoRegistro = false;
}
}
@using (Html.BeginForm())
{
if (!novoRegistro)
{
@Html.HiddenFor(m => m.PessoaID)
}
<div class="row">
<div class="col-md-6 col-sm-12 col-xs-12">
@Html.LabelFor(m => m.Apelido) @Html.ValidationMessageFor(m => m.Apelido)
@Html.TextBoxFor(m => m.Apelido, new { @class = "form-control" })
</div>
</div>
<div class="row">
<div class="col-md-12 col-sm-12 col-xs-12">
@Html.LabelFor(m => m.Nome) @Html.ValidationMessageFor(m => m.Nome)
@Html.TextBoxFor(m => m.Nome, new { @class = "form-control" })
</div>
</div>
if (novoRegistro)
{
<!-- Botões de Inserir -->
}
else
{
<!-- Botões de Detalhar -->
}
}
Para finalizar temos a Action do POST. Ela segue a mesma ideia utilizada na View, se a propriedade PessoaID estiver 0, indica uma inserção, senão será uma edição. Lembre-se estou usando Entity Framework.
public ActionResult Cadastro(Pessoa model)
{
using (var db = new Conexao())
{
if (model.PessoaID == 0)
{
db.Pessoa.Add(model);
}
else
{
var registro = db.Pessoa.Find(model.PessoaID);
UpdateModel(registro);
}
db.SaveChanges();
return RedirectToAction("Cadastro", controller, new { id = model.PessoaID });
}
}
Espero que gostem do post.
Os códigos fontes estão no meu Pastebin
https://pastebin.com/UJKcssq1
https://pastebin.com/J1Jy2Dge
https://pastebin.com/udx5UfFL
Posted on April 2, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.