【发布时间】:2017-07-10 22:16:55
【问题描述】:
我将以下对象传递给 MVC 控制器:
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]
上面两个都没有找到页面错误。
更新:
我在寻求答案的过程中向前迈进了一步。
好的,根据帮助者的要求,我已经包含了更多的源代码。
我有三门课。
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");
}
最后,从 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 方法。您调用的方法的签名是什么?
-
它在 MVC 控制器操作上使用 HttpGet
-
是的,我知道 - 方法的签名又是什么(如果它是模型,则显示该模型)
-
签名为:public FileResult MethodName(SearchCriteria data)
-
模型为:public class SearchCriteria { public SearchMode searchMode {get;set;} public SearchData searchData {get;set;}}
标签: javascript c# jquery json asp.net-mvc