WebGet JSON复杂参数

时间:2014-03-13 00:35:11

标签: jquery asp.net json web-services webservice-client

服务方法如下所示

public class UploadItem
{
  public string fileName { get; set; }
  public string fileDesc { get; set; }
}
[OperationContract, WebGet]
public int WriteUploadItem(UploadItem uploadItem)
{
  //implementation
}

调用看起来像这样

var data = {
  fileName: self.fileName(),
  fileDesc: self.fileDesc(),
};

$.ajax({
  url: "Fx.svc/WriteUploadItem",
  data: { uploadItem: data },
  success: function (result) {
    //implementation
  },
  error: function (result) { alert($.parseJSON(result.responseText).Message); }
});

产生这个

GET http://localhost:49701/Fx.svc/WriteUploadItem?uploadItem%5BfileName%5D
=2014-01-21.gif&uploadItem%5BfileDesc%5D=adesgfA HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: */*
Referer: http://localhost:49701/index.html#upload-queue
Accept-Language: en-AU,en;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: localhost:49701
DNT: 1
Connection: Keep-Alive

解码后,这些URL编码参数如下所示

uploadItem[fileName]=2014-01-21.gif&uploadItem[fileDesc]=adesgfA 

调用WebGet方法但参数为null。

我成功地将一个参数传递给另一个像这样的方法

var userId = "73c2e254-5440-45eb-9099-58fa08dd037b"; // me.UserID();
$.ajax({
  url: "Fx.svc/UserFiles",
  data: { userId: userId },
  success: function (result) {
    //implementation
  },
  error: function (result) { alert($.parseJSON(result.responseText).Message); }
});

据我所知,唯一的区别是参数的值不同。最初有更多的字段,但我删除了更麻烦的数据类型,并且很有兴趣发现即使使用简单的字符串也会出现问题。

出了什么问题,该怎么办?我需要在C#UploadItem类上添加某种属性吗?

1 个答案:

答案 0 :(得分:1)

$ .ajax()使用的默认编码为application/x-www-form-urlencoded

要解决此问题,请控制编码并告诉另一端确切使用了哪种编码。请注意对象的显式字符串化以及text/json的{​​{1}}的显式编码。

contentType

除非指定不同的编码,否则您指定的内容类型编码也将用于返回值。通常,获取JSON非常令人满意,因为$ .ajax()会神奇地将其解析为结果对象,但是当您返回一个简单类型(例如var data = { fileName: self.fileName(), fileDesc: self.fileDesc(), }; $.ajax({ url: "Fx.svc/WriteUploadItem", data: JSON.stringify(data), contentType: "text/json" }).done(function (result) { //implementation }).error(function (err) { //handle error }); )时,您需要指定返回编码text / plain使用int参数。

dataType