分享

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

 印度阿三17 2019-11-11

我将以下对象传递给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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约