none
Problemas ao dar Post em uma ViewModel para o Controller - Asp.Net RRS feed

  • Pergunta

  • Tenho uma ViewModel que utilizo para carregar dados de uma pessoa física ou jurídica. Ela contém algumas propriedades como PessoasNaturezas, dentre outras, que eu utilizo para carregar meus dropdownlists da minha view. O Problema está justamente entre minha view e meu método Create da minha Controller. Quando eu dou um Post, as propriedades da minha viewmodel ficam com NULL... Parece que, ao dar o Post, o sistema limpa e seta as propriedades que são do tipo IEnumerable para null. Como resolver isso????

    public class PessoaViewModel { [DisplayName("Código")] public int Id { get; set; } [DisplayName("Natureza")] [Required(ErrorMessage ="Escolha uma Natureza")] public PessoaNatureza PessoaNatureza { get; set; } [DisplayName("Natureza")] public string PessoaNaturezaDescricao { get; set; } [DisplayName("Naturezas")] public IEnumerable<SelectListItem> PessoasNaturezas { get; set; } public PessoaFisicaViewModel PessoaFisicaViewModel { get; set; } public PessoaJuridicaViewModel PessoaJuridicaViewModel { get; set; }

    }

    @using SistemaComercial.Domain.ValueObjects
    @model SistemaComercial.Application.ViewModels.Pessoa.PessoaViewModel
    @{
        ViewData["Title"] = "Cadastrar Nova Pessoa";
    }
    <div class="panel">
        <div class="panel-heading">
            <h2 class="panel-title">Cadastrar nova Pessoa</h2>
        </div>
        <form asp-action="Create">
            <div class="panel-body container-fluid">
                @* Replacing classic Validation Summary to Custom ViewComponent as TagHelper *@
                <vc:summary />
                <!-- Example Tabs -->
                <div class="example-wrap">
                    <div class="nav-tabs-horizontal">
                        <ul class="nav nav-tabs" data-plugin="nav-tabs" role="tablist">
                            <li class="active" role="presentation">
                                <a data-toggle="tab" href="#exampleTabsOne" aria-controls="exampleTabsOne"
                                   role="tab">Dados Pessoais</a>
                            </li>
                            <li role="presentation">
                                <a data-toggle="tab" href="#exampleTabsTwo" aria-controls="exampleTabsTwo"
                                   role="tab">Documentos</a>
                            </li>
                            <li role="presentation">
                                <a data-toggle="tab" href="#exampleTabsThree" aria-controls="exampleTabsThree"
                                   role="tab">Endereços</a>
                            </li>
                            <li role="presentation">
                                <a data-toggle="tab" href="#exampleTabsFour" aria-controls="exampleTabsFour"
                                   role="tab">Contatos</a>
                            </li>
                        </ul>
                        <div class="tab-content padding-top-20">
                            <div class="tab-pane active" id="exampleTabsOne" role="tabpanel">
                                <div class="form-horizontal">
                                    <div class="form-group">
                                        <label asp-for="Id" class="col-md-2 control-label"></label>
                                        <div class="col-md-2">
                                            <input asp-for="Id" class="form-control" disabled="disabled" />
                                            <span asp-validation-for="Id" class="text-danger"></span>
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label asp-for="PessoaNatureza" class="col-md-2 control-label"></label>
                                        <div class="col-md-3">
                                            <select asp-for="PessoaNatureza" asp-items="Model.PessoasNaturezas" class="form-control">
                                                <option value="">--SELECIONE--</option>
                                            </select>
                                            <span asp-validation-for="PessoaNatureza" class="text-danger"></span>
                                        </div>
                                    </div>
    
                                    @if (Model.PessoaNatureza == PessoaNatureza.Fisica)
                                    {
                                        @await Html.PartialAsync("_PessoaFisica")
                                    }
                                    else if (Model.PessoaNatureza == PessoaNatureza.Juridica)
                                    {
                                        @await Html.PartialAsync("_PessoaJuridica")
                                    }
                                    else
                                    {
                                        @await Html.PartialAsync("_PessoaFisica")
                                    }
    
                                </div>
                            </div>
                            <div class="tab-pane" id="exampleTabsTwo" role="tabpanel">
    
                            </div>
                            <div class="tab-pane" id="exampleTabsThree" role="tabpanel">
    
                            </div>
                            <div class="tab-pane" id="exampleTabsFour" role="tabpanel">
    
                            </div>
                        </div>
                    </div>
                </div>
                <!-- End Example Tabs -->
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        @*<input type="submit" value="Gravar" class="btn btn-success" />
                            <a asp-action="Index" class="btn btn-info">Voltar à Lista</a>*@
    
                        <button type="submit" class="btn btn-success"><i class="icon wb-check" aria-hidden="true"></i> Gravar</button>
    
                        <a asp-action="Index" class="btn btn-danger">
                            <span title="Retornar à Lista" class="icon wb-arrow-left"></span> Retornar à lista
                        </a>
    
                    </div>
                </div>
            </div>
        </form>
    </div>
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }

    @model SistemaComercial.Application.ViewModels.Pessoa.PessoaViewModel
    @{
        ViewData["Title"] = "PessoaFisica";
    }
    
    <div class="form-horizontal">
        <div class="form-group">
            <label asp-for="PessoaFisicaViewModel.NomeCompleto" class="col-md-2 control-label"></label>
            <div class="col-md-8">
                <input asp-for="PessoaFisicaViewModel.NomeCompleto" class="form-control" />
                <span asp-validation-for="PessoaFisicaViewModel.NomeCompleto" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="PessoaFisicaViewModel.Apelido" class="col-md-2 control-label"></label>
            <div class="col-md-8">
                <input asp-for="PessoaFisicaViewModel.Apelido" class="form-control" />
                <span asp-validation-for="PessoaFisicaViewModel.Apelido" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="PessoaFisicaViewModel.DataNascimento" class="col-md-2 control-label"></label>
            <div class="col-md-4">
                <input asp-for="PessoaFisicaViewModel.DataNascimento" class="form-control" />
                <span asp-validation-for="PessoaFisicaViewModel.DataNascimento" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="PessoaFisicaViewModel.Sexo" class="col-md-2 control-label"></label>
            <div class="col-md-3">
                <select asp-for="PessoaFisicaViewModel.Sexo" asp-items="Model.PessoaFisicaViewModel.Sexos" class="form-control">
                    <option value="">-- SELECIONE --</option>
                </select>
                <span asp-validation-for="PessoaFisicaViewModel.Sexo" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="PessoaFisicaViewModel.EstadoCivil" class="col-md-2 control-label"></label>
            <div class="col-md-3">
                <select asp-for="PessoaFisicaViewModel.EstadoCivil" asp-items="Model.PessoaFisicaViewModel.EstadosCivis" class="form-control">
                    <option value="">-- SELECIONE --</option>
                </select>
                <span asp-validation-for="PessoaFisicaViewModel.EstadoCivil" class="text-danger"></span>
            </div>
        </div>
    </div>
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }

    @model SistemaComercial.Application.ViewModels.Pessoa.PessoaViewModel
    @{
        ViewData["Title"] = "PessoaJuridica";
    }
    
    <div class="form-horizontal">
        <div class="form-group">
            <label asp-for="PessoaJuridicaViewModel.RazaoSocial" class="col-md-2 control-label"></label>
            <div class="col-md-8">
                <input asp-for="PessoaJuridicaViewModel.RazaoSocial" class="form-control" />
                <span asp-validation-for="PessoaJuridicaViewModel.RazaoSocial" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="PessoaJuridicaViewModel.NomeFantasia" class="col-md-2 control-label"></label>
            <div class="col-md-8">
                <input asp-for="PessoaJuridicaViewModel.NomeFantasia" class="form-control" />
                <span asp-validation-for="PessoaJuridicaViewModel.NomeFantasia" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="PessoaJuridicaViewModel.DataAbertura" class="col-md-2 control-label"></label>
            <div class="col-md-8">
                <input asp-for="PessoaJuridicaViewModel.DataAbertura" class="form-control" />
                <span asp-validation-for="PessoaJuridicaViewModel.DataAbertura" class="text-danger"></span>
            </div>
        </div>
    </div>
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }
    

     [HttpPost]
            [Authorize(Policy = "CanWriteCustomerData")]
            [Route("pessoa-gerenciamento/cadastrar-novo")]
            [ValidateAntiForgeryToken]
            public IActionResult Create(PessoaViewModel pessoaViewModel)
            {
                if (!ModelState.IsValid) return View(pessoaViewModel);
                _pessoaAppService.RegisterPessoaFisica(pessoaViewModel);
    
                if (IsValidOperation())
                    ViewBag.Sucesso = "Pessoa Cadastrada!";
    
                return View(pessoaViewModel);
            }


    BreakPoint:



    • Movido welington jrModerator quinta-feira, 8 de março de 2018 21:49 forum mais especifico
    • Editado JR-Master quinta-feira, 8 de março de 2018 23:53
    quinta-feira, 8 de março de 2018 21:37

Respostas

  • Jalber boa noite,

    a propriedade PessoaNatureza deve ser int.

    Pois vai guardar o código da pessoa natureza.

    Se vc alterar isso na sua model vai funcionar.


    Att, Lucio Rogerio


    Espero ter ajudado, se ajudei, por favor Vote como Útil, e se resolvi seu problema, clique em Marcar como Resposta.

    • Marcado como Resposta JR-Master quinta-feira, 15 de março de 2018 17:46
    quinta-feira, 8 de março de 2018 22:56

Todas as Respostas

  • Boa noite Lucio!

    É que ela é um enum... neste caso, ela acumulará número 1 - Pessoa Física ou 2 - Pessoa Jurídica....

    eu tentei alterar para int, mas continuou o mesmo problema.... :(


    • Editado JR-Master quinta-feira, 8 de março de 2018 23:23
    quinta-feira, 8 de março de 2018 23:23
  • Como estão as partials de pessoa física e jurídica?

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 8 de março de 2018 23:46
  • Eu as inseri na publicação, mas aparentemente estão com o mesmo problema.... Esses campos que estão com problema, são os dos dropdownlists... eles são carregados normalmente... O Problema acontece apenas quando eu clico no botão gravar para fazer o post... 
    quinta-feira, 8 de março de 2018 23:56
  • Olá jalber

    Você conseguiu resolver?

    att.

    quinta-feira, 15 de março de 2018 15:29
    Moderador
  • Olá Lucio, posso sim. tenho marcado bastante resposta aqui. coisa de lá de 2011

    quinta-feira, 15 de março de 2018 15:37
    Moderador
  • Eu me confundi Lucio, o problema foi resolvido... é que fiz umas alterações que geraram outro problema  que está neste Post...

    https://social.msdn.microsoft.com/Forums/pt-BR/f9b04a20-35ae-40e7-b1ae-b8e68e854684/modelstateclear-no-est-funcionando-aspnet-core-mvc?forum=mvcpt

    Vou fechar este Post. Obrigado :)

    quinta-feira, 15 de março de 2018 17:47