gpt4 book ai didi

Javascript Windows.Location 传递复杂的 JSON 对象

转载 作者:行者123 更新时间:2023-11-29 10:32:44 25 4
gpt4 key购买 nike

我将以下对象传递给 MVC Controller :

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]

在上述两个方面都出现页面未找到错误。

更新:

我已经在寻求答案的过程中向前迈进了。

好的,根据帮助者的要求,我已经包含了更多源代码。

我有三个类(class)。

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 已被 chop )

以下是我的 Controller 代码:

[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");
}

最后,从 cshtml 文件进行的 Ajax 调用。

$("#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。

一定是这样吗?

最佳答案

您不能像这样将复杂的 javascript 对象传递给 GET 方法。 GET 没有正文并且要绑定(bind)到模型,您的查询字符串名称/值对必须与您绑定(bind)到的对象的属性相匹配。例如,要绑定(bind)到 MainSearchSearchMode 属性的 mode 属性,您的查询字符串需要包含

....&SearchMode.mode=2....

将用于生成 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代码

 $.ajax(
{
url: '@Url.Action("DownloadFileCSV", "Home")' + '?' + $.param(data),
type: "GET",
success: function () {

还要注意以下几点

  1. 没有必要使用 Number(..) 将值转换为number - 它全部以文本形式通过网络发送
  2. GET 没有正文,所以设置 ajax contentType 选项是毫无意义
  3. 您的方法不返回 json,所以 datatype: 'json' 不会感觉。
  4. 无需将防伪 token 传递给 GET 方法

话虽如此,但不清楚您想在这里做什么。 MainSearch search() 方法中的代码从不使用模型的任何值。它返回一个 FileResult,它不能与 ajax 调用一起工作(但它可以与 window.location 一起工作,在这种情况下,成功回调中的代码需要是

var baseUrl = '@Url.Action("DownloadFileCSV", "Home")';
var queryString = $.param(data);
window.location = baseUrl + '?' + queryString;

但随后不清楚为什么要对该方法进行 2 次调用 - ajax 调用,然后是重定向(ajax 调用根本不执行任何操作)。

关于Javascript Windows.Location 传递复杂的 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42364825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com