0

我有一个要序列化的类,但我正在使用[JsonProperty("Name")]属性注释更改输出字符串的属性名称。如下所示:

[JsonProperty("Name")]
public string PersonName{ get; set; }

现在,当我想取回数据时,这些值无法映射到属性,因此它们被设置为 null。
这就是我获取数据的方式:

[WebMethod]
    public static void GetData(List<Person> persons)
    {
    //each persons Name property comes as null
    }

这就是我从客户端发送数据的方式:

$.ajax({
    type: "POST",
    url: "TestPage.aspx/GetData",
    data: "{'persons':" + '[{ "Name": "Me"}]' + "}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function () {
        alert("Data Submitted");
    }
});

现在我无法阻止 .NET 序列化我从客户端传递的 JSON 字符串,所以我必须让我的页面方法接受参数类型,List<Person>否则我会收到错误,这也阻止我使用JsonConvert.DeserializeObject<List<Person>>(person);这将解决映射问题.
所以,请有人花时间阅读这篇文章并给我一些想法。

4

1 回答 1

1

您的 Web 方法正在接受人员列表,但这不是您从客户端传递的内容。您正在传递一个包含人员列表的对象。如果你想让它工作,你应该只传递列表本身而不是将它包装在一个对象中。

$.ajax({
    type: "POST",
    url: "TestPage.aspx/GetData",
    data: '[{ "Name": "Me"}]',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function () {
        alert("Data Submitted");
    }
});

如果您无法更改客户端,另一种选择是更改服务器端以期望包装器对象。

创建一个类来保存列表...

class PersonListWrapper
{
    public List<Person> persons { get; set; }
}

...并更改您的网络方法以接受该课程。

[WebMethod]
public static void GetData(PersonListWrapper wrapper)
{
    foreach (Person p in wrapper.persons)
    {
        ...
    }
}
于 2013-09-11T12:01:51.010 回答