title: Problems Serializing a Form and Converting It to a Complex Class in Asp.net Core MVC to Post a Whole Model Using Ajax
body: <p>I am serializing my ASP.NET form so that it will be converted according to my PessoaViewModel complex class. Apparently, serialization occurs correctly, but when I post using ajax, paratically 98% of fields are loaded with null value. Below I posted a piece of the serialized class:</p>
  
  <p>ExibirTelaPesquisaCpfCnpjAntesCadastrarPessoa=False&amp;PessoaViewModel.Id=2&amp;PessoaViewModel.PessoaNatureza=Juridica&amp;PessoaViewModel.PessoaFisicaViewModel.PessoaId=2&amp;PessoaViewModel.PessoaFisicaViewModel.NomeCompleto=JALBER%20ROMANO&amp;PessoaViewModel.PessoaFisicaViewModel.Apelido=BIM&amp;PessoaViewModel.PessoaFisicaViewModel.DataNascimento=2019-11-18&amp;PessoaViewModel.PessoaFisicaViewModel.Sexo=Masculino&amp;PessoaViewModel.PessoaFisicaViewModel.EstadoCivil=Solteiro&amp;PessoaViewModel.PessoaFisicaViewModel.PessoaFisicaOrigem=Brasileiro&amp;PessoaViewModel.PessoasEnderecosViewModel%5B0%5D.Id=3&amp;PessoaViewModel.PessoasEnderecosViewModel%5B0%5D.PessoaId=2&amp;PessoaViewModel.PessoasEnderecosViewModel%5B0%5D.EnderecoTipoDescricao=COBRAN%C3%87A&amp;PessoaViewModel.PessoasEnderecosViewModel%5B0%5D.RotuloEnderecoTipo=Endere%C3%A7o%20de%20cobran%C3%A7a%20%C3%A9%20utilizado%20para%20definir%20o%20local%20de%20cobran%C3%A7a%20de%20mercadorias%20adquiridas%20pelos%20clientes.&amp;PessoaViewModel.PessoasEnderecosViewModel%5B0%5D.EnderecoTipoId=3&amp;PessoaViewModel.PessoasEnderecosViewModel%5B0%5D.PaisId=1&amp;PessoaViewModel.PessoasEnderecosViewModel%5B0%5D.CodigoPostal=29780-000&amp;......</p>
  
  <p>JS:</p>
  
  <pre><code>var pessoaViewModel = $('form').serialize();
  
  $.ajax({
      url: "/pessoa-gerenciar/change-pessoa-natureza",
      type: "POST",
      data: JSON.stringify({ pessoaViewModel: pessoaViewModel}),
      contentType: "application/json",
      success: function (data) {
  
      },
      error: function () {
          stopLoadModalInside();
          alert("Oops! Algo deu errado.");
      }
  });
  </code></pre>
  
  <p>Asp.Net Core MVC (
  (Controller, PessoaViewModel Class, and subclasses)):</p>
  
  <pre><code>public class PessoaViewModel
  {
      [Key]
      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&lt;SelectListItem&gt; PessoasNaturezas { get; set; }
  
      public PessoaFisicaViewModel PessoaFisicaViewModel { get; set; }
      public PessoaJuridicaViewModel PessoaJuridicaViewModel { get; set; }
  
      public List&lt;PessoaGenericoViewModel&gt; PessoasGenericosViewModel { get; set; }
      public List&lt;PessoaContatoViewModel&gt; PessoasContatosViewModel { get; set; }
      public List&lt;PessoaDocumentoViewModel&gt; PessoasDocumentosViewModel { get; set; }
      public List&lt;PessoaEnderecoViewModel&gt; PessoasEnderecosViewModel { get; set; }
  
      //Configuracoes
      //public bool AtivarBloqueioRedundanciaCpfCnpj { get; set; }
      public bool ExibirTelaPesquisaCpfCnpjAntesCadastrarPessoa { get; set; }
  
      //DropDownList Novo Contato
      public IEnumerable&lt;SelectListItem&gt; FormasContato { get; set; }
  
      //DropDownList Novo Endereco
      public IEnumerable&lt;SelectListItem&gt; EnderecosTipos { get; set; }
  
      //DropDownList
      public IEnumerable&lt;SelectListItem&gt; DocumentosTipos { get; set; }
  
      // public IEnumerable&lt;SelectListItem&gt; DocumentosOrgaosEmissores { get; set; }
  
      public IEnumerable&lt;SelectListItem&gt; Paises { get; set; }
  
      public PessoaViewModel()
      {
          PessoasNaturezas = ExtensaoDeEnumerador.EnumParaSelectListGenerico&lt;PessoaNatureza&gt;("U", PessoaNatureza.ToString()).OrderBy(x =&gt; x.Text);
          PessoaFisicaViewModel = null;
          PessoaJuridicaViewModel = null;
      }
  }
  
  
   public class PessoaDocumentoViewModel
  {
      [Key]
      public int Id { get; set; }
  
      [DisplayName("Pessoa")]
      [Required(ErrorMessage = "Escolha uma Pessoa")]
      public int PessoaId { get; set; }
  
      [DisplayName("Tipo de Documento")]
      [Required(ErrorMessage = "Escolha um Tipo de Documento")]
      public int DocumentoTipoId { get; set; }
  
      public string DocumentoTipoDescricao { get; set; }
      public string RotuloDocumentoTipo { get; set; }
      public string DocumentoTipoSigla { get; set; }
  
      [DisplayName("Documento")]
      [Required(ErrorMessage = "O campo Número do Documento é obrigatório")]
      [MaxLength(30, ErrorMessage = "O campo {0} deve ter no máximo {1} caracteres")]
      public string Documento { get; set; }
  
      public PessoaDocumentoDataEmissaoViewModel PessoaDocumentoDataEmissaoViewModel { get; set; }
      public PessoaDocumentoDataPrimeiraEmissaoViewModel PessoaDocumentoDataPrimeiraEmissaoViewModel { get; set; }
      public PessoaDocumentoDataVencimentoViewModel PessoaDocumentoDataVencimentoViewModel { get; set; }
      public PessoaDocumentoDataExpedicaoViewModel PessoaDocumentoDataExpedicaoViewModel { get; set; }
      public PessoaDocumentoOrgaoEmissorViewModel PessoaDocumentoOrgaoEmissorViewModel { get; set; }
      public PessoaDocumentoZonaViewModel PessoaDocumentoZonaViewModel { get; set; }
      public PessoaDocumentoSecaoViewModel PessoaDocumentoSecaoViewModel { get; set; }
      public PessoaDocumentoCategoriaViewModel PessoaDocumentoCategoriaViewModel { get; set; }
      public PessoaDocumentoSerieViewModel PessoaDocumentoSerieViewModel { get; set; }
      public PessoaDocumentoPaisViewModel PessoaDocumentoPaisViewModel { get; set; }
      public PessoaDocumentoUFViewModel PessoaDocumentoUFViewModel { get; set; }
  
      public IEnumerable&lt;SelectListItem&gt; DocumentosTipos { get; set; }
      public IEnumerable&lt;SelectListItem&gt; DocumentosOrgaosEmissores { get; set; }
      public IEnumerable&lt;SelectListItem&gt; Paises { get; set; }
  
  }
  
  
  [HttpPost]
  [Route("pessoa-gerenciar/change-pessoa-natureza")]
  public PartialViewResult ChangePessoaNatureza([FromBody] PessoaViewModel pessoaViewModel)
  {
  
      return null;
  }
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/0u9BB.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/0u9BB.png" alt="enter image description here"></a></p>
  
  <p>As far as I studied, serialization uses only fields that are neither null nor empty. Why isn't it working? Are there invalid characters in field names since many of them are within Lists?
  Does anyone know how to help me?
  Thank you!</p>