C# MVC - Action Única para Inserir e Atualizar Registro

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 });
    }            
}

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *