C# MVC — Action Única para Inserir e Atualizar Registro
Published: 2024-04-02 02:38:16

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