Ajax Json 传递正确的数据,但方法获取具有空属性的对象

本文关键字:获取 方法 对象 属性 Json 数据 Ajax | 更新日期: 2023-09-27 18:37:17

我有一个Ajax调用,它将对象列表发送到控制器中的方法.
我查看了它发送的 json,一切似乎都井井有条。但是当它到达控制器时,列表就在那里,具有正确数量的对象,但它们的所有属性都是空的,即使值在 json 上正确设置也是如此。

示例:我有一个包含 10 个对象的 List,所有这些对象的属性都使用特定值设置。我执行调用,但是当列表到达控制器时,它有 10 个对象,它们的所有属性都将设置为 null。

有人知道为什么会这样吗?

这是调用:
由于数据量大,我不得不使用 post 而不是 get。

$("#testeFA").click(function()
{
    <% JavaScriptSerializer serializador = new JavaScriptSerializer(); %>
    var models = <%: MvcHtmlString.Create(serializador.Serialize(apontamentos)) %>
    //"apontamentos" is the name of the List<ApontamentoModel>
    $.post('<%: Url.Action("GeraFA") %>', { models: models }, function (sucesso)
    {
        //do whatever
    }, 'json');
});

这是方法:

public JsonResult GeraFA(List<ApontamentoModel> models) <- this is where the list shows all the objects' properties as null
{
    JsonResult result = new JsonResult();
    //do whatever
    result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    return result;
 }

这是 json 的一部分,所以你可以看到结构:

[{"DocEntry":1,
  "LineID":5,
  "Data":"01/06/2012",
  "HoraInicial":
      {"Ticks":288000000000,
       "Days":0,
       "Hours":8,
       "Milliseconds":0,
       "Minutes":0,
       "Seconds":0,
       "TotalDays":0.33333333333333331,
       "TotalHours":8,
       "TotalMilliseconds":28800000,
       "TotalMinutes":480,
       "TotalSeconds":28800},
  "CodigoCliente":"C00013",
  "Cliente":"Client Name",
  "CodigoProjeto":283,
  "Projeto":"Project Name",
  "CodigoServico":18,
  "TipoServico":"",
  "CodigoDespesa":0,
  "Despesa":"",
  "Quantidade":0,
  "NumeroChamado":0,
  "NumeroFA":10,
  "Apropria":true,
  "Narrativa":"teste",
  "NomeConsultor":"Name"},
 {"DocEntry":1,
  "LineID":13 //and so on to all the other elements

我正在使用 MVC2

Ajax Json 传递正确的数据,但方法获取具有空属性的对象

ASP.NET MVC 2 不支持开箱即用的 JSON 请求。此功能已内置 ASP.NET MVC 3 中。不过,您可以编写自定义JsonValueProviderFactory来实现这一点。Phil Haack写了一篇关于这个主题的优秀博客文章。您还需要使用 $.ajax 而不是 Phil 所示的$.post,以便能够将application/json请求设置为Content-Type标头。

因此,在应用程序中下载并注册JsonValueProviderFactory后,您可以:

$('#testeFA').click(function() {
    <% JavaScriptSerializer serializador = new JavaScriptSerializer(); %>
    //"apontamentos" is the name of the List<ApontamentoModel>
    var models = <%= serializador.Serialize(apontamentos) %>;
    $.ajax({
        url: '<%= Url.Action("GeraFA") %>',
        type: 'post',
        contentType: 'application/json;charset=utf-8',
        data: JSON.stringify({ models: models }),
        success: function(result) {
            //do whatever
        }
    });
});

另请注意 JSON.stringify 方法的用法,该方法将 javascript models变量转换为要发送到 contentType 参数指定的服务器的 JSON 字符串。此方法是所有现代浏览器中的本机内置。如果您需要支持某些旧版浏览器,则可以在页面中包含 json2.js 脚本。