序列化数组并通过 get 方法传递它的最佳方法是什么


What's the best way to serialize an array and pass it through the get method

所以我使用 ajax 请求来传递一些数据以进行过滤。

然后我使用历史记录.js因此我可以更改 url 并向浏览器添加状态,从而可以返回、前进等。这样,我就可以使用 ajax 请求或普通请求来过滤数据。目前为止,一切都好。

我的问题是,在我通过ajax请求传递的数据中有一个数组:

function updateContent(url, state) {
    $.ajax({
        type: 'GET',
        data: {name: state.filter_name, num: state.filter_number, 
            data: state.filter_data, array: state.filter_array},
        url: url,
        success: function(msg) {
                $('#ajax').html(msg);
        }
    }); 
    
}

这将向此 URL 发出请求:

http: //localhost/Project/Controller/?filter_array%5B%5D=1&filter_array%5B%5D=50&filter_array%5B%5D=70.

我想把这个网址传递给 history.pushstate

如果我使用 jsenconde 然后手动构建 url,url 会略有不同,如下所示:

http://localhost/Project/Controller/?filter_array=["1","50","70"]

虽然它更干净,但我在某处读到你不应该在 url 中使用 [],但即使我使用这种方式,我也会得到两种类型的 GET url,ajax URL ?filter_array%5B%5D=1&filter_array%5B%5D=50&filter_array%5B%5D=70.和 json 网址?filter_array=["1","50","70"] .

所以我只需要一个解决方案,让我只得到一种类型的 GET url,这样我就可以使用相同的 url 到 ajax 和普通请求。

传递值数组的标准方法是重复传递带有 [] 的名称(url 编码),如第一个示例所示。

您需要以符合此要求的方式生成您的 URL...

filter_array[]=1&filter_array[]=2&filter_array[]=3

当然,正如您所显示的那样进行编码....

filter_array%5B%5D=1&filter_array%5B%5D=2&filter_array%5B%5D=3

如果你坚持这种格式,你的代码将更具可移植性(例如 ASP.Net 将自动执行到List的转换,许多PHP库也是如此)。

有什么原因不能生成这种格式的网址吗?

这里的区别在于,一个使用标准表单编码,另一个转换JSON

jQuery是对JSON对象进行URL编码,以便没有非法字符。如果你想使用 javascript 检索该 GET 变量,你必须从 URL 中提取数据,URL 对其进行解码,然后使用 JSON.parse() 将其重新转换为 JavaScript 对象。

http://www.w3schools.com/jsref/jsref_encodeuri.asp