如何使用包含数组的复杂对象构建查询字符串?

How to build a query string with a complex object that includes an array?

我的 google-fu 今天不工作了。我发现了许多类似的问题,但 none 适合我的特定情况。我正在尝试构建一个查询字符串以在不使用 post 的情况下将数据传递到我的 MVC 控制器,因为我正在使用 windows.open 来显示 PDF 文件。

javascript中的对象看起来像这样

{DateValue: "05/31/2020", 
 StringArray: ["String 1", "String 2", etc], 
 StringValue: "Some String Value"}

当使用 $.param() 将我的对象转换为参数时,StringArray 变成了

StringArray[]=String 1&StringArray[]=String 2

而对控制器的调用是

window.open('/{controller}/{action}?' + $.param(data), '_blank');

数据就是上面的对象。

ViewModel

public class Model
{
   public DateTime DateValue {get;set;}
   public List<string> StringArray {get;set;}
   public string StringValue {get;set;}
}

控制器调用

public FileContentResult Action(Model model)
{...}

无论出于何种原因,MVC 都无法识别字符串数组。该模型具有 DateValue 和 StringValue 属性的正确值,但 StringArray 始终为空。

您应该可以使用 JSON.stringify()

const data = {DateValue: "05/31/2020", 
 StringArray: ["String 1", "String 2", etc], 
 StringValue: "Some String Value"}

window.open('/{controller}/{action}?data=' + JSON.stringify(data), '_blank');

JSON.parse

//PARAMS = how you ever you planned to retrieve them from the request
const data = JSON.parse(PARAMS.data);

console.log(data); 
/* 
// outputs: 
{
  DateValue: "05/31/2020", 
  StringArray: ["String 1", "String 2", etc], 
  StringValue: "Some String Value"
}
*/

结束了重构调用以首先进行 ajax 调用,将视图模型放入缓存,然后 return 一个带有缓存键的 url 用于window.open打电话。它需要进行两次服务器调用,但至少我们消除了将所有数据放入查询字符串的需要。