我将以下对象传递给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 Object]
在上述两个页面上都找不到页面错误.
更新:
我一直在寻求答案.
根据助手的要求,我提供了更多的源代码.
我有三堂课.
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方法. GET没有主体,要绑定到模型,您的查询字符串名称/值对必须与绑定到的对象的属性匹配.例如,要绑定到MainSearch的SearchMode属性的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 () {
另请注意以下
>使用Number(..)将值转换为a是没有意义的 数字-全部通过文本发送 > GET没有主体,因此设置ajax contentType选项为 无意义 >您的方法不会返回json,因此数据类型:’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调用根本不执行任何操作). 来源:https://www./content-3-557301.html
|