的Javascript Windows.Location传递复杂JSON对象
我下面的对象,我传递到MVC控制器:的Javascript Windows.Location传递复杂JSON对象
this.JsonData = {
"__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val(),
"searchMode": {
"mode": Number(mode.val()),
"pageSize": Number(pagesize.val()) || 5, "pageNumber": Number(pagenumber.val()) || 1,
"sortField": sortfield.val() || "Ref",
"sortDirection": sortdirection.val() || "desc"
},
"searchData": {
"Compare": Number(StdComparison.val()),
"SearchTextFrom": searchText.val(),
"SearchTextTo": searchTextTo.val()
}
这工作不错,但我最近需求已经出现,由此我期待这个编码与JavaScript函数使用对象window.location的
建议我用:
how-to-pass-complex-json-object-in-url-using-javascript
window.location + "?SearchCriteria=" + JSON.Stringify(this.JsonData);
创建以下请求:
Controller/Action?SearchCriteria={
"__RequestVerificationToken": "tokenvalue",
"searchMode": {
"mode": 2,
"pageSize": 5,
"pageNumber": 1,
"sortField": "Ref",
"sortDirection": "desc"
},
"searchData": {
"Compare": 1,
"SearchTextFrom": "From A",
"SearchTextTo": "To Z"
}
}
而
window.location + "?SearchCriteria=" + this.JsonData;
产生以下:
Controller/Action?SearchCriteria=[object%20Object]
由于未找到错误两个以上的页面。
UPDATE:
我已经在寻求一个答案前移。
好,根据helpers的请求,我已经包含更多的源代码。
我有三个类。
public class MainSearch
{
public MainSearch()
{
SearchData searchData = new SearchData();
SearchMode searchMode = new SearchMode();
}
public SearchData searchData { get; set; }
public SearchMode searchMode { get; set; }
public int? page { get; set; }
public object ToPagedListParameters(int pagenumber)
{
searchMode.pageNumber = pagenumber;
return page;
}
public IList<string> ValidationErrorMessages { get; set; }
}
public class SearchData
{
// Fields used for the ticket number search
public int? ticketNumberCompare { get; set; }
public string ticketSearchTextFrom { get; set; }
public string ticketSearchTextTo { get; set; }
}
public class SearchMode
{
public int? mode { get; set; }
public int? pageNumber { get; set; }
public int? pageSize { get; set; }
public string sortDirection { get; set; }
public string sortField { get; set; }
public string userURN { get; set; }
public string __RequestVerificationToken { get; set; }
}
这些类持有用于搜索(SearchData已被截断)的标准
以下是我的控制器代码:
[HttpGet]
public ActionResult DownloadFileCSV(MainSearch search)
{
string fileName = Server.MapPath("~/Content/Pdf/") + "somefile.pdf";
byte[] fileContents = System.IO.File.ReadAllBytes(fileName);
return File(fileContents, "application/pdf", "result.pdf");
}
最后,Ajax调用即发来自cshtml文件。
$("#DownloadAttachmentCSV").click(function() {
$.ajax(
{
url: '@Url.Action("DownloadFileCSV", "Home")',
contentType: 'application/json; charset=utf-8',
datatype: 'json',
data: JsonData,
type: "GET",
success: function() {
window.location = '@Url.Action("DownloadFileCSV", "Home")' + '?' + JsonData;
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
});
奇怪的是,上面的代码实际上工作和文件被下载,但这是问题。 JSON数据没有填充MainSearch变量。
到目前为止,我可以让JSON数据填充c#类的唯一方法是将该方法更改为POST。
这是真的吗?您使用的查询参数应该是正确的URI
您无法将复杂的JavaScript对象传递给GET方法。一个GET没有主体并且绑定到一个模型,你的查询字符串名/值对必须匹配你绑定的对象的属性。例如绑定到的MainSearch
的SearchMode
属性的mode
属性,查询字符串将需要您使用生成的JavaScript对象
var data = {
'searchMode.mode': mode.val(),
'searchMode.pageSize': pagesize.val() || 5,
'searchMode.pageNumber': pagenumber.val() || 1,
'searchMode.sortField': sortfield.val() || "Ref",
'searchMode.sortDirection': sortdirection.val() || "desc",
'searchData.SearchTextFrom': StdComparison.val(),
'searchData.Compare': searchText.val(),
'searchData.SearchTextTo': searchTextTo.val(),
}
和AJAX包括
....&SearchMode.mode=2....
更改代码代码
$.ajax(
{
url: '@Url.Action("DownloadFileCSV", "Home")' + '?' + $.param(data),
type: "GET",
success: function() {
还要注意以下
- 没有使用
Number(..)
将值转换为 数量是没有意义的 - 它所有跨网发送文本 - 一个GET没有身体因此设置了ajax
contentType
选项 毫无意义 - 你的方法做不返回JSON所以
datatype: 'json'
不会使 有意义。 - 传递的防伪标记的GET方法是没有必要的
话虽如此,它不清楚你想在这里做什么。 MainSearch search()
方法中的代码从不使用模型的任何值。它返回一个FileResult
不能用Ajax调用工作(但它可以与window.location
工作,这这种情况下,在成功回调的代码将需要
var baseUrl = '@Url.Action("DownloadFileCSV", "Home")';
var queryString = $.param(data);
window.location = baseUrl + '?' + queryString;
但随后其原因尚不清楚你在做2调用方法 - ajax调用,然后是重定向(ajax调用什么也不做)
任何编码的,尤其是像JSON:
window.location + "?SearchCriteria=" + encodeURIComponent(JSON.Stringify(this.JsonData));
我不知道该模型粘合剂被设计成JSON转换成一个GET请求到类实例,但上面所做的尝试绝对不是要走的路。
试过JL,仍然没有工作 – gilesrpa
您可以将一个复杂的javascript对象传递给GET方法。您调用的方法的签名是什么? –
它使用HttpGet在MVC控制器上的动作 – gilesrpa
是的,我知道 - 该方法的签名又是什么(如果它的模型,显示该模型) –