【问题标题】:Problems Posting in a Model with AJAX in ASP.NET CORE MVC在 ASP.NET CORE MVC 中使用 AJAX 在模型中发布问题
【发布时间】:2019-03-15 09:47:31
【问题描述】:

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

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; }
}

【问题讨论】:

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


    【解决方案1】:

    您已将 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)
    

    【讨论】:

      【解决方案2】:

      我认为如果您删除 [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);
                      }
                  });
      

      【讨论】:

      • 有趣的是,使用具有 Integer、bool 或 String 属性的简单模型执行此操作可以正常工作。具有 NULL 值的属性是否会导致转换变得混乱?
      • 如果您发送空值,那么您应该设置可空属性。喜欢 int 到 int?
      • 我在 JS 中将它们设置为 null 值的一些属性。我做错了吗?
      • 公共 int PessoaId { 获取;放; } 这对公共 int?佩索阿德{得到;放; }。我的意思是,如果您从 js 发送 null 属性,则将服务器端属性更改为可为 null。
      • 我之前有一个问题,他们在论坛中帮助了我。请注意,如果我对一个简单的类执行相同的操作,它现在正在工作。在示例中,我给出了来自运营商模型operadoraChamadasViewModel 的帖子。我正在尝试做同样的事情,只是我将模型更改为 pesoaContatoViewModel(模型有点复杂)并且它不起作用:stackoverflow.com/questions/55172797/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2020-03-19
      • 1970-01-01
      相关资源
      最近更新 更多