2
I made an Edit function that works with 3 different models, get loads the id data I selected, but at post time, the integers within the dropdowns comes with attribute 0.
Follow my code for evaluation:
Controller:
[HttpGet]
public ActionResult EditarFuncionario(string id) {
int Id = Convert.ToInt32(MyCrypto.Decrypt(id));
var vm = new FuncionarioVm();
var vmTel = new TelefoneVm();
var vmEnd = new EnderecoVm();
var func = db.Funcionarios.Find(Id);
var tel = db.Telefones.FirstOrDefault(x => x.AssociadoId == Id);
var end = db.Enderecos.FirstOrDefault(x => x.AssociadoId == Id);
vm.CarregarVm(func);
vmTel.CarregarTelVm(tel);
vmEnd.CarregarEndVm(end);
ViewData["Funcionarios"] = vm;
ViewData["Telefones"] = vmTel;
ViewData["Enderecos"] = vmEnd;
ConfigurarViewBagVm(vm, vmTel, vmEnd);
return View(vm);
}
[HttpPost]
public ActionResult EditarFuncionario(FuncionarioVm item1, TelefoneVm item2, EnderecoVm item3) {
ConfigurarViewBagVm(item1, item2, item3);
try {
if (ModelState.IsValid) {
//AlterarFuncionario(item1, item2, item3);
var func = new Funcionario();
func.AssociadoId = item1.AssociadoId;
func.Email = item1.Email;
func.ClassificacaoId = item1.ClassificacaoId;
func.Nome = item1.Nome;
func.Rg = item1.Rg;
func.Cpf = item1.Cpf;
func.SexoId = item1.SexoId;
func.DataNascimento = item1.DataNascimento;
func.NroCtps = item1.NumeroCTPS;
func.SerieCtps = item1.SerieCTPS;
func.NroPis = item1.NumeroPis;
func.DataContratacao = item1.DataContratacao;
func.CargoId = item1.CargoId;
func.ContaBancaria = item1.ContaBancaria;
func.ContaBancariaId = item1.ContaBancariaId;
func.GroupId = item1.GroupId;
db.Entry(func).State = EntityState.Modified;
var tel = new Telefone();
tel.Ddd = item2.Ddd;
tel.Numero = item2.NumeroTelefone;
tel.TipoTelefoneId = item2.TipoTelefoneId;
db.Entry(tel).State = EntityState.Modified;
var end = new Endereco();
end.Rua = item3.Rua;
end.Bairro = item3.Bairro;
end.Numero = item3.Numero;
end.Cep = item3.Cep;
end.Complemento = item3.Complemento;
end.TipoEndereco = item3.TipoEndereco;
end.TipoEnderecoId = item3.TipoEnderecoId;
end.Cidade = item3.Cidade;
end.CidadeId = item3.CidadeId;
db.Entry(end).State = EntityState.Modified;
db.SaveChanges();
ViewBag.Mensagem = "Alterado com sucesso!";
}
} catch (Exception) {
ModelState.AddModelError("", "Erro");
}
return RedirectToAction("ManterFuncionario");
}
Function that configures dropdowns:
private void ConfigurarViewBagVm(FuncionarioVm vm, TelefoneVm vmTel, EnderecoVm vmE) {
ViewBag.SexoId = db.Sexos.Select(item => new SelectListItem { Text = item.Nome, Value = item.SexoId.ToString(), Selected = item.SexoId == vm.SexoId }).OrderBy(item => item.Text).ToList();
ViewBag.CargoId = db.Cargos.Select(item => new SelectListItem { Text = item.Nome, Value = item.CargoId.ToString(), Selected = item.CargoId == vm.CargoId }).OrderBy(item => item.Text).ToList();
ViewBag.ClassificacaoId = db.Classificacoes.Select(item => new SelectListItem { Text = item.Nome, Value = item.ClassificacaoId.ToString(), Selected = item.ClassificacaoId == vm.ClassificacaoId }).OrderBy(item => item.Text).ToList();
ViewBag.BancoId = db.Bancos.Select(item => new SelectListItem { Text = item.Nome, Value = item.BancoId.ToString(), Selected = item.BancoId == vm.BancoId }).OrderBy(item => item.Text).ToList();
ViewBag.GroupId = db.Groups.Select(item => new SelectListItem { Text = item.GroupName, Value = item.GroupId.ToString(), Selected = item.GroupId == vm.GroupId }).OrderBy(item => item.Text).ToList();
ViewBag.TipoContaId = db.TipoContas.Select(item => new SelectListItem { Text = item.Tipo, Value = item.TipoContaId.ToString(), Selected = item.TipoContaId == vm.TipoContaId }).OrderBy(item => item.Text).ToList();
ViewBag.TipoTelefoneId = db.TipoTelefones.Select(item => new SelectListItem { Text = item.Tipo, Value = item.TipoTelefoneId.ToString(), Selected = item.TipoTelefoneId == vm.TipoTelefoneId }).OrderBy(item => item.Text).ToList();
ViewBag.CidadeId = db.Cidades.Select(item => new SelectListItem { Text = item.Nome, Value = item.CidadeId.ToString(), Selected = item.CidadeId == vmE.CidadeId }).OrderBy(item => item.Text).ToList();
ViewBag.TipoEnderecoId = db.TipoEnderecos.Select(item => new SelectListItem { Text = item.Tipo, Value = item.TipoEnderecoId.ToString(), Selected = item.TipoEnderecoId == vmE.TipoEnderecoId }).OrderBy(item => item.Text).ToList();
ViewBag.EstadoId = db.Estados.Select(item => new SelectListItem { Text = item.Nome, Value = item.EstadoId.ToString(), Selected = item.EstadoId == vmE.EstadoId }).OrderBy(item => item).ToList();
}
@using DigitalFashion.Models.Pessoas
@using DigitalFashion.Util
@{
FuncionarioVm Item1 = ViewData["Funcionarios"] as FuncionarioVm;
TelefoneVm Item2 = ViewData["Telefones"] as TelefoneVm;
EnderecoVm Item3 = ViewData["Enderecos"] as EnderecoVm;
}
@{
ViewBag.Title = "EditarFuncionario";
}
@using (Html.BeginForm("EditarFuncionario", "Pessoa", FormMethod.Post)) {
@Html.AntiForgeryToken()
@Html.HiddenFor(x => Item1.AssociadoId)
@Html.HiddenFor(x => Item2.AssociadoId)
@Html.HiddenFor(x => Item3.AssociadoId)
<div class="form-horizontal">
<section class="content-header">
<h1>Editando os dados do funcionário: @Item1.Nome</h1>
<ol class="breadcrumb">
<li><a href="~/Home"><i class="fa fa-home"></i>Home</a></li>
<li><a href="~/Home">Pessoas</a></li>
<li class="active"> Editando funcionário</li>
</ol>
</section>
<br />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="container cadastro-cliente">
<div class="row">
<div class="col-sm-12">
<!-- CONTENT FIRST TAB -->
<div class="tab-content cadastro-cliente" id="nav-tabContent">
<div class="tab-pane fade show active" id="nav-dados-pessoais" role="tabpanel" aria-labelledby="nav-dados-pessoais-tab">
<div class="form-row">
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.Nome, htmlAttributes: new { @class = "control-label col-md-3" })
<div class="col-md-12">
@Html.EditorFor(model => Item1.Nome, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item1.Nome, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.Usuario, htmlAttributes: new { @class = "control-label col-md-3" })
<div class="col-md-12">
@Html.EditorFor(model => Item1.Usuario, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item1.Usuario, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.Senha, htmlAttributes: new { @class = "control-label col-md-3" })
<div class="col-md-12">
@Html.EditorFor(model => Item1.Senha, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item1.Senha, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.Rg, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => Item1.Rg, "", new { @class = "form-control" })
@Html.ValidationMessageFor(model => Item1.Rg, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.Cpf, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.TextBoxFor(model => Item1.Cpf, "", new { @class = "form-control" })
@Html.ValidationMessageFor(model => Item1.Cpf, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.DataNascimento, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.TextBoxFor(model => Item1.DataNascimento, "dd/MM/yyyy", new { @class = "form-control", @type = "date" })
@Html.ValidationMessageFor(model => Item1.DataNascimento, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.DataContratacao, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.TextBoxFor(model => Item1.DataContratacao, "dd/MM/yyyy", new { @class = "form-control", @type = "date" })
@Html.ValidationMessageFor(model => Item1.DataContratacao, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.SexoId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("SexoId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item1.SexoId, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.CargoId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("CargoId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item1.CargoId, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-6 mb-3">
@Html.LabelFor(model => Item1.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item1.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item1.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-6 mb-3">
@Html.LabelFor(model => Item1.NumeroPis, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item1.NumeroPis, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item1.NumeroPis, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.NumeroCTPS, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.TextBoxFor(model => Item1.NumeroCTPS, "", new { @class = "form-control" })
@Html.ValidationMessageFor(model => Item1.NumeroCTPS, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.SerieCTPS, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.TextBoxFor(model => Item1.SerieCTPS, "", new { @class = "form-control" })
@Html.ValidationMessageFor(model => Item1.SerieCTPS, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item2.Ddd, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.TextBoxFor(model => Item2.Ddd, "", new { @class = "form-control" })
@Html.ValidationMessageFor(model => Item2.Ddd, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item2.NumeroTelefone, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.TextBoxFor(model => Item2.NumeroTelefone, "", new { @class = "form-control" })
@Html.ValidationMessageFor(model => Item2.NumeroTelefone, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item2.TipoTelefoneId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("TipoTelefoneId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item2.TipoTelefoneId, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-8 mb-3">
@Html.LabelFor(model => Item3.Rua, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item3.Rua, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item3.Rua, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-2 mb-3">
@Html.LabelFor(model => Item3.Numero, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item3.Numero, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item3.Numero, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-2 mb-3">
@Html.LabelFor(model => Item3.Bairro, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item3.Bairro, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item3.Bairro, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-2 mb-3">
@Html.LabelFor(model => Item3.Complemento, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item3.Complemento, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item3.Complemento, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-4 mb-3">
@Html.LabelFor(model => Item3.Cep, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item3.Cep, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item3.Cep, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item3.TipoEnderecoId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("TipoEnderecoId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item3.TipoEnderecoId, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item3.CidadeId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("CidadeId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item3.CidadeId, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item3.EstadoId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("EstadoId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item3.EstadoId, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.ClassificacaoId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("ClassificacaoId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item1.ClassificacaoId, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-4 mb-3">
@Html.LabelFor(model => Item1.ContaBancaria.Numero, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item1.ContaBancaria.Numero, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item1.ContaBancaria.Numero, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.ContaBancaria.Agencia, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.EditorFor(model => Item1.ContaBancaria.Agencia, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => Item1.ContaBancaria.Agencia, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.BancoId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("BancoId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item1.BancoId, "", new { @class = "text-danger" })
</div>
</div>
<div class="col-md-3 mb-3">
@Html.LabelFor(model => Item1.TipoContaId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-12">
@Html.DropDownList("TipoContaId", null, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Item1.TipoContaId, "", new { @class = "text-danger" })
</div>
</div>
<p>
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Editar Cliente" class="btn btn-success btn-cadastra-cliente" />
</div>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
}
I’ve tried to change my code in every way, but I just can’t get past this step.
It would be interesting to group these your three viewmodels into one that owns the three.
– Leandro Angelo
Can the lack of grouping of vms be the problem? I had some complications in grouping them, but I will try this way you suggested me
– Pedro Baraldini
Another detail is the mess you are making with Viewmodel, Viewbag and Viewdata.
– Leandro Angelo
What a mess? Could you give me some tips on how to write cleaner code? I am using the viewbag to make the configuration of my dropdown and the Viewdata to load the data of other models in a View, previously I was using tuples to make this upload, but I switched to Viewdata for aesthetic reasons
– Pedro Baraldini
Take a look at this article. https://www.mytecbits.com/microsoft/dot-net/viewmodel-viewdata-viewbag-tempdata-mvc
– Leandro Angelo