如何在查询字符串中传递JSON?

4
我正在尝试使用Jquery.param将JSON编码到URI中并发送到服务器,但是我遇到了以下错误。
window.location.href = BriefExportPath+$.param(JSON.stringify({
                        title: $('.ui-dialog-title').text(),
                        items: ko.utils.arrayMap(Neptune.BriefCountrySection.SelectedCountries(), function (item) {
                            return item.ItemName
                        })
                    }))



[CustomAuthorize(Definitions.RoleSonarAdmin)]
        public FileContentResult ExportCsv(string json)
        {
            var x = new System.Web.Script.Serialization.JavaScriptSerializer();
            object obj = x.DeserializeObject(json);
            //return File(Helpers.BriefCsvBytes.GetCsvBytes(items), "text/csv", title); 
            return null;
        }



http://dev.neptune.local/Briefs/ExportCsv?0=%7B&1=%22&2=t&3=i&4=t&5=l&6=e&7=%22&8=%3A&9=%22&10=B&11=r&12=i&13=e&14=f&15=+&16=C&17=o&18=u&19=n&20=t&21=r&22=y&23=+&24=L&25=i&26=s&27=t&28=%22&29=%2C&30=%22&31=i&32=t&33=e&34=m&35=s&36=%22&37=%3A&38=%5B&39=%22&40=A&41=f&42=r&43=i&44=c&45=a&46=%22&47=%2C&48=%22&49=A&50=m&51=e&52=r&53=i&54=c&55=a&56=s&57=%22&58=%2C&59=%22&60=A&61=s&62=i&63=a&64=%22&65=%2C&66=%22&67=E&68=u&69=r&70=o&71=p&72=e&73=%22&74=%5D&75=%7D

enter image description here


你在将数据添加到查询字符串之前使用 JSON.stringify(data) 吗? - David
你尝试过使用HttpUtility.UrlDecode()吗? - Dave Hogan
重要的代码行肯定在579之前。json变量在哪里被赋值了? - Joe
看起来你的查询字符串参数名称是错误的。从那个截图看,它看起来是 '0'。 - David
4个回答

5

来自jQuery.param()手册:

创建序列化表示形式的数组或对象,适用于在URL查询字符串或Ajax请求中使用。

您正在传递JSON.stringify的返回值,它是一个字符串

相反,您需要传递一个对象。

var json = JSON.stringify(etc etc);
var url = BriefExportPath + $.param( { "json": json } );
location = url;

您的服务器端代码将需要从json查询键中提取数据。


我还使用了'var oo = xx.Deserialize<MyCustomObject>(json);'而不是'DeserializeObject()',这样我就不必在代码中处理数组。只需确保你的JSON属性名称与对象名称匹配即可。我不需要列出所有属性,只需列出我想要填充的属性即可。 - Yogurt The Wise

0

您的服务器期望输入最终出现在某个可预测的变量名称中,但是您似乎试图将其放入名为0的GET变量中,正如我们在ExportCsv?0=中所看到的。

您的代码期望的是ExportCsv?json=

请确保将值传递给正确的GET变量名称


它正在自动分配为0。 - Farhad-Taran
那么我们至少能看到捕获GET变量值的代码吗? - Timothy Groote

0

为什么你不使用这个?

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    complete: callback
});

使用替代方案而非查询字符串。


2
因为我正在从服务器返回一个文件。 - Farhad-Taran
那么,为什么不将contentType更改为与您返回的文件类型相匹配呢? - Timothy Groote
@TimothyGroote — 如果文件是通过.ajax请求的,那么这怎么有帮助呢?而且你怎么知道服务器端代码发出了错误的内容类型呢? - Quentin
$.ajax 的不同之处在于它通过异步进程获取信息。即使使用 $.ajax,您也可以请求文件下载。 - Timothy Groote
同时,在评论时我没有得到服务器返回的文件类型的任何指示。 - Timothy Groote
contentType 只指定发送到服务器的数据格式。 - Kevin B

0
var jObj = (JObject)JsonConvert.DeserializeObject(json);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接