在ASP.NET CORE MVC中使用AJAX在模型中发布问题

时间:2019-03-15 09:47:31

标签: c# ajax asp.net-core asp.net-core-mvc

我在使用Asp.net中的JAX进行复杂模型发布时遇到麻烦。该模型具有代表其他模型的某些属性,但是目前,我只需要使用NULL对其进行初始化。我不知道缺少什么,但是我的控制器正在获取“空”值...在客户端完成的转换中存在一些问题。有人知道如何帮助我吗?

enter image description here

var pessoaContatoViewModel = {
    Id: 0,
    PessoaId: 0,
    FormaContatoId: formaContatoId,
    FormaContatoDescricao: '',
    FormasContatos: null,
    ContatosTipos: null,
    FormaContatoTipoId: 0,
    Contato: contato,
    Observacao: observacao,
    ContatoPrincipal: contatoPrincipal,
    PessoaContatoChamadaViewModel: null,
    PessoaContatoRedeSocialViewModel: null,
    PessoaContatoEmailViewModel: null
};

$.ajax({
    url: "/pessoa-gerenciar/changeFormaContato",
    type: "POST",
    data: JSON.stringify(pessoaContatoViewModel),
    contentType: "application/json",
    dataType: "json",
    success: function (result) {
        alert('ok');
    },
    error: function () {
        alert("Oops! Algo deu errado.");
        console.log(pessoaContatoViewModel);
    }
});


[HttpPost]
[Route("pessoa-gerenciar/changeFormaContato")]
public IActionResult ChangeFormaContato([FromBody] PessoaContatoViewModel pessoaContatoViewModel)
{
    //ViewBag.indice_new = indice;
    //return PartialView("~/Views/Pessoa/PessoaContato/_PessoaContatoAdd.cshtml", _pessoaContatoAppService.CreateNew(pessoaNatureza, formaContatoId));
    return null;
}


public class PessoaContatoViewModel
{
    [Key]
    public int Id { get; set; }

    public int PessoaId { get; set; }

    [DisplayName("Forma de Contato")]
    [Required(ErrorMessage = "Escolha a Forma de Contato")]
    [JsonConverter(typeof(StringEnumConverter))]
    public int FormaContatoId { get; set; }
    public string FormaContatoDescricao { get; set; }
    public IEnumerable<SelectListItem> FormasContatos { get; set; }

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

    [DisplayName("Forma de Contato")]
    [Required(ErrorMessage = "Selecione uma Forma de Contato")]
    public int FormaContatoTipoId { get; set; }

    [DisplayName("Contato")]
    [Required(ErrorMessage = "O campo Contato é obrigatório")]
    [MaxLength(100, ErrorMessage = "O campo {0} deve ter no máximo {1} caracteres")]
    public string Contato { get; set; }

    [DisplayName("Observação")]
    [MaxLength(150, ErrorMessage = "O campo {0} deve ter no máximo {1} caracteres")]
    public string Observacao { get; set; }

    [DisplayName("Principal")]
    public bool ContatoPrincipal { get; set; }

    public FormaContatoTipoViewModel FormaContatoTipoViewModel { get; set; }
    public PessoaContatoChamadaViewModel PessoaContatoChamadaViewModel { get; set; }
    public PessoaContatoRedeSocialViewModel PessoaContatoRedeSocialViewModel { get; set; }
    public PessoaContatoEmailViewModel PessoaContatoEmailViewModel { get; set; }
}

2 个答案:

答案 0 :(得分:0)

enter image description here

我认为,如果您删除[From body],并在JavaScript“ Json.Stringify”中删除,它将正常工作。我还删除了内容类型。

var pessoaContatoViewModel = {
                Id: 1,
                PessoaId: 3,
                FormaContatoId: 0,
                FormaContatoDescricao: '',
                FormasContatos: null,
                ContatosTipos: null,
                FormaContatoTipoId: 0,
                Contato: null,
                Observacao: null,
                ContatoPrincipal: null,
                PessoaContatoChamadaViewModel: null,
                PessoaContatoRedeSocialViewModel: null,
                PessoaContatoEmailViewModel: null
            };

            $.ajax({
                url: "/Home/changeFormaContato",
                type: "POST",
                data: pessoaContatoViewModel,
                //contentType: "application/json",
                dataType: "json",
                success: function (result) {
                    alert('ok');
                },
                error: function () {
                    alert("Oops! Algo deu errado.");
                    console.log(pessoaContatoViewModel);
                }
            });

答案 1 :(得分:0)

您已将null付诸行动,因为模型联编程序某些字段的值无效。这意味着,如果属性为int,则需要传递有效数字;如果属性为bool,则需要传递truefalse,而无需传递其他任何内容。如果您需要使用默认值(null来初始化属性,则可以忽略这些属性

var pessoaContatoViewModel = {
    //Id: 0, omit default value
    //PessoaId: 0,
    FormaContatoId: formaContatoId, //make sure this is valid integer
    FormaContatoDescricao: '',
    //FormasContatos: null, omit default value
    //ContatosTipos: null, omit default value
    //FormaContatoTipoId: 0, omit default value
    Contato: contato,
    Observacao: observacao,
    ContatoPrincipal: contatoPrincipal, //make sure this boolean or string "true" or "false"
    //PessoaContatoChamadaViewModel: null, omit default value
    //PessoaContatoRedeSocialViewModel: null, omit default value
    //PessoaContatoEmailViewModel: null omit default value
};

如果您通过以下模型,那么一切都会很好

var pessoaContatoViewModel = {
    FormaContatoId: 7,
    FormaContatoDescricao: '',
    Contato: "val",
    Observacao: "some string",
    ContatoPrincipal: true
};

还考虑为请求后的请求创建单独的模型,仅接受您需要的数据(但这不是必需的)

public class PessoaContatoModel
{
    public int FormaContatoId { get; set; }
    public string FormaContatoDescricao { get; set; }
    public string Contato { get; set; }
    public string Observacao { get; set; }
    public bool ContatoPrincipal { get; set; }
}

[HttpPost]
[Route("pessoa-gerenciar/changeFormaContato")]
public IActionResult ChangeFormaContato([FromBody] PessoaContatoModel pessoaContatoViewModel)