Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Asp.net核心MVC中序列化表单并将其转换为复杂类以使用Ajax发布整个模型时遇到的问题_Javascript_Ajax_Asp.net Core_Serialization_Asp.net Ajax - Fatal编程技术网

Javascript 在Asp.net核心MVC中序列化表单并将其转换为复杂类以使用Ajax发布整个模型时遇到的问题

Javascript 在Asp.net核心MVC中序列化表单并将其转换为复杂类以使用Ajax发布整个模型时遇到的问题,javascript,ajax,asp.net-core,serialization,asp.net-ajax,Javascript,Ajax,Asp.net Core,Serialization,Asp.net Ajax,我正在序列化我的ASP.NET表单,以便根据我的PessoaViewModel复杂类进行转换。显然,序列化是正确的,但是当我使用ajax发布时,98%的字段都加载了空值。下面我发布了序列化类的一部分: Exibirapesquisacpfcnpjantescadarpessoa=False和PessoaViewModel.Id=2和PessoaViewModel.PessoaNatureza=Juridica和PessoaViewModel.pessoafiewmodel.PessoaId=2和

我正在序列化我的ASP.NET表单,以便根据我的PessoaViewModel复杂类进行转换。显然,序列化是正确的,但是当我使用ajax发布时,98%的字段都加载了空值。下面我发布了序列化类的一部分:

Exibirapesquisacpfcnpjantescadarpessoa=False和PessoaViewModel.Id=2和PessoaViewModel.PessoaNatureza=Juridica和PessoaViewModel.pessoafiewmodel.PessoaId=2和PessoaViewModel.pessoafiewmodel.NomeCompleto=JALBER%20罗马诺和PessoaViewModel.pessoafiscaviewmodel.Apelido=BIM和pessoavivewmodel.soafisicavemodel.Pes=BIM和pessoavivevemodel.soafisicavemodel.Pes=18-2019-nascim数据soaViewModel.Pessoafiscaviewmodel.Sexo=男性和PessoaViewModel.Pessoafiscaviewmodel.EstadoCivil=Solteiro和PessoaViewModel.Pessoafiscaviewmodel.Pessoafiscaorigem=Brasilero和PessoaViewModel.Pessoanederecosviewmodel%5D.Id=3和Pessoavemodel.PessoasEnderecosViewModel%5b%5b.Pessoanederecosviewmodel%5DIpodescripcao=COBRAN%C3%87A和PessoaViewModel.PessoasEnderecosViewModel%5B0%5D.Rotulodenderecoptipo=Endere%C3%A7o%20de%20cobran%C3%A9%20a%20a%20a%20a%20d%20o%20de%20cobran%C3%A7a%20de%20d%20a%20a%20a%20客户和PessoaveedecosviewModel.PessoaderecosviewModel%5b%3和PessoadecosViewModel%5B0%5D.PaisId=1和PessoaViewModel.PessoAsendercoSViewModel%5B0%5D.CodigoPostal=29780-000&

JS:

Net核心MVC( (控制器、PessoaViewModel类和子类):

公共类PessoaViewModel
{
[关键]
公共int Id{get;set;}
[显示名称(“自然”)]
[必需(ErrorMessage=“Escolha uma Natureza”)]
公共PessoaNatureza PessoaNatureza{get;set;}
[显示名称(“自然”)]
公共字符串pessoanaturezademicao{get;set;}
[显示名称(“性质”)]
公共IEnumerable PessoasNaturezas{get;set;}
公共PessoaFisicaViewModel PessoaFisicaViewModel{get;set;}
公共PessoaJuridicaViewModel PessoaJuridicaViewModel{get;set;}
公共列表PessoasGenericosViewModel{get;set;}
公共列表pessoascontosviewmodel{get;set;}
公共列表PessoasDocumentosViewModel{get;set;}
公共列表PessoasEnderecosViewModel{get;set;}
//构型
//公共bool-ativalbloqueioredundianciacpfcnpj{get;set;}
公共bool exibirtelapesquisacpfcnpjantescadarpessoa{get;set;}
//诺沃康塔托酒店
public IEnumerable FormasContato{get;set;}
//诺沃恩德雷科酒店
公共IEnumerable EnderecosTipos{get;set;}
//下拉列表
公共IEnumerable DocumentosTipos{get;set;}
//公共IEnumerable文档组织missores{get;set;}
公共IEnumerable对{get;set;}
公共PessoaViewModel()
{
PessoasNaturezas=ExtensaoDeEnumerador.EnumParasElectionListGenerico(“U”,PessoaNatureza.ToString()).OrderBy(x=>x.Text);
PessoaFisicaViewModel=null;
PessoaJuridicaViewModel=null;
}
}
公共类PessoadDocumentViewModel
{
[关键]
公共int Id{get;set;}
[显示名称(“Pessoa”)]
[必需(ErrorMessage=“Escolha uma Pessoa”)]
public int PessoaId{get;set;}
[显示名称(“文档提示”)]
[必需(ErrorMessage=“Escolha um Tipo de Documento”)]
公共int DocumentoTipoId{get;set;}
公共字符串DocumentoTipoDescricao{get;set;}
公共字符串RotuloDocumentOpo{get;set;}
公共字符串DocumentoTipoSigla{get;set;}
[显示名称(“文档”)]
[必需(ErrorMessage=“O campo Número do Documentoéobrigatório”)]
[MaxLength(30,ErrorMessage=“O campo{0}deveter no máximo{1}字符”)]
公共字符串Documento{get;set;}
公共PessoaDocumentoDataEmissaoViewModel PessoaDocumentoDataEmissaoViewModel{get;set;}
公共PessoaDocumentoDataPrimeiraEmissaoViewModel PessoaDocumentoDataPrimeiraEmissaoViewModel{get;set;}
公共PessoaDocumentoDataVencimentoViewModel PessoaDocumentoDataVencimentoViewModel{get;set;}
公共PESSOADOCUMENTODataExpedicaviewModel PESSOADOCUMENTODataExpedicaviewModel{get;set;}
公共PESSOADOCUMENTORGAOEMISSORVIEWMODEL PESSOADOCUMENTORGAOEMISSORVIEWMODEL{get;set;}
公共PessoaDocumentoZonaViewModel PessoaDocumentoZonaViewModel{get;set;}
公共PessoaDocumentoSecaoViewModel PessoaDocumentoSecaoViewModel{get;set;}
公共PESSOADOCUMENTOCATIVEAVIEWMODEL PESSOADOCUMENTOCATIVEAVIEWMODEL{get;set;}
公共PessoaDocumentoSerieViewModel PessoaDocumentoSerieViewModel{get;set;}
公共PessoaDocumentoPaisViewModel PessoaDocumentoPaisViewModel{get;set;}
公共PESSOADOCumentOfViewModel PESSOADOCumentOfViewModel{get;set;}
公共IEnumerable DocumentosTipos{get;set;}
公共IEnumerable文档组织missores{get;set;}
公共IEnumerable对{get;set;}
}
[HttpPost]
[路线(“pessoa GERECIAR/改变pessoa性质”)]
公共部分结果变更PESSOANATUREZA([来源]PessoaViewModel PessoaViewModel)
{
返回null;
}

据我所知,序列化只使用既不为null也不为空的字段。为什么不起作用?字段名中是否有无效字符,因为许多字符都在列表中? 有人知道如何帮助我吗? 谢谢大家!

当您使用.serialize()时,它以“查询字符串”格式生成数据,需要使用默认的contentType(即
application/x-www-form-urlencoded)发送该数据;charset=UTF-8
,不作为JSON

删除
contentType
选项或指定contentType:
application/x-www-form-urlencoded;字符集=UTF-8

@model PessoaViewModel
<form>
    <input asp-for="PessoaNaturezaDescricao" />
    <input asp-for="ExibirTelaPesquisaCpfCnpjAntesCadastrarPessoa" />
    ...
    <input asp-for="PessoasDocumentosViewModel[0].PessoaId" />
    <input asp-for="PessoasDocumentosViewModel[0].Documento" />
    <input type="button" onclick="test()"/>
</form>
@section Scripts
{
<script>
    function test()
    {
        var pessoaViewModel = $('form').serialize();
        $.ajax({
            url: "/pessoa-gerenciar/change-pessoa-natureza",
            type: "POST",
            data: pessoaViewModel,
            success: function (data) {
            },
            error: function () {
                stopLoadModalInside();
                alert("Oops! Algo deu errado.");
            }
        });
            }

</script>
}

为什么要将表单序列化为url编码的字符串,然后再将该字符串序列化为Json?也许你可以就这样
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<SelectListItem> PessoasNaturezas { get; set; }

    public PessoaFisicaViewModel PessoaFisicaViewModel { get; set; }
    public PessoaJuridicaViewModel PessoaJuridicaViewModel { get; set; }

    public List<PessoaGenericoViewModel> PessoasGenericosViewModel { get; set; }
    public List<PessoaContatoViewModel> PessoasContatosViewModel { get; set; }
    public List<PessoaDocumentoViewModel> PessoasDocumentosViewModel { get; set; }
    public List<PessoaEnderecoViewModel> PessoasEnderecosViewModel { get; set; }

    //Configuracoes
    //public bool AtivarBloqueioRedundanciaCpfCnpj { get; set; }
    public bool ExibirTelaPesquisaCpfCnpjAntesCadastrarPessoa { get; set; }

    //DropDownList Novo Contato
    public IEnumerable<SelectListItem> FormasContato { get; set; }

    //DropDownList Novo Endereco
    public IEnumerable<SelectListItem> EnderecosTipos { get; set; }

    //DropDownList
    public IEnumerable<SelectListItem> DocumentosTipos { get; set; }

    // public IEnumerable<SelectListItem> DocumentosOrgaosEmissores { get; set; }

    public IEnumerable<SelectListItem> Paises { get; set; }

    public PessoaViewModel()
    {
        PessoasNaturezas = ExtensaoDeEnumerador.EnumParaSelectListGenerico<PessoaNatureza>("U", PessoaNatureza.ToString()).OrderBy(x => 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<SelectListItem> DocumentosTipos { get; set; }
    public IEnumerable<SelectListItem> DocumentosOrgaosEmissores { get; set; }
    public IEnumerable<SelectListItem> Paises { get; set; }

}


[HttpPost]
[Route("pessoa-gerenciar/change-pessoa-natureza")]
public PartialViewResult ChangePessoaNatureza([FromBody] PessoaViewModel pessoaViewModel)
{

    return null;
}
@model PessoaViewModel
<form>
    <input asp-for="PessoaNaturezaDescricao" />
    <input asp-for="ExibirTelaPesquisaCpfCnpjAntesCadastrarPessoa" />
    ...
    <input asp-for="PessoasDocumentosViewModel[0].PessoaId" />
    <input asp-for="PessoasDocumentosViewModel[0].Documento" />
    <input type="button" onclick="test()"/>
</form>
@section Scripts
{
<script>
    function test()
    {
        var pessoaViewModel = $('form').serialize();
        $.ajax({
            url: "/pessoa-gerenciar/change-pessoa-natureza",
            type: "POST",
            data: pessoaViewModel,
            success: function (data) {
            },
            error: function () {
                stopLoadModalInside();
                alert("Oops! Algo deu errado.");
            }
        });
            }

</script>
}
[HttpPost]
[Route("pessoa-gerenciar/change-pessoa-natureza")]
public PartialViewResult ChangePessoaNatureza([FromForm] PessoaViewModel pessoaViewModel)
{

    return null;
}