Well I just solved my own problem, but I got rid of $.param()
I encode my object with json, uri encode it, and send the whole thing to my controller action as a querystring parameter:
var data = { Search: searchInput, Export: exportInput };
var url = "/ListViews/Export/";
var json = encodeURIComponent(JSON.stringify(data));
var fullUrl = url + "?json=" + json;
Then in my controller, I simply use JsonConvert.DeserializeObject to map the json to a .NET object:
var o = JsonConvert.DeserializeObject<ExportObject>(json);
.NET Classes:
public class ExportObject
{
public ListViewsApiController.SearchInput Search { get; set; }
public ExportInput Export { get; set; }
}
public class ExportInput
{
public bool PDF { get; set; }
public bool XLS { get; set; }
public bool XML { get; set; }
}
public class SearchInput
{
public int ListId { get; set; }
public string Query { get; set; }
public ListViewConfig.SortBy SortBy { get; set; }
public SortDirection SortDirection { get; set; }
public List<int> UserTypes { get; set; }
}