首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript传递复杂Windows.Location对象

Javascript传递复杂Windows.Location对象
EN

Stack Overflow用户
提问于 2017-02-21 10:31:38
回答 2查看 8K关注 0票数 3

下面是我要传递给MVC控制器的对象:

代码语言:javascript
复制
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

代码语言:javascript
复制
window.location + "?SearchCriteria=" + JSON.Stringify(this.JsonData);

创建以下请求:

代码语言:javascript
复制
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"
    }
}

鉴于

代码语言:javascript
复制
window.location + "?SearchCriteria=" + this.JsonData;

编制了下列文件:

代码语言:javascript
复制
Controller/Action?SearchCriteria=[object%20Object]

在上述两个方面都没有找到错误的页面。

更新:

我在寻求答案方面取得了进展。

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

我有三节课。

代码语言:javascript
复制
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已被截断)

以下是我的控制器代码:

代码语言:javascript
复制
[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调用。

代码语言:javascript
复制
$("#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。

一定是这样吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-21 23:42:40

不能将复杂的javascript对象传递给这样的GET方法。GET没有主体,要绑定到模型,查询字符串名称/值对必须匹配绑定到的对象的属性。例如,要绑定到SearchMode属性的MainSearch属性,查询字符串需要包括

代码语言:javascript
复制
....&SearchMode.mode=2....

将用于生成javascript对象的代码更改为

代码语言: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代码

代码语言:javascript
复制
 $.ajax(
    {
        url: '@Url.Action("DownloadFileCSV", "Home")' + '?' + $.param(data),
        type: "GET",
        success: function () {

还请注意以下事项

  1. 使用Number(..)将值转换为数字是没有意义的--所有这些值都是以文本的形式通过导线发送的。
  2. GET没有对象,因此设置ajax contentType选项是没有意义的。
  3. 您的方法不返回json,因此datatype: 'json'没有意义。
  4. 将防伪令牌传递给GET方法是不必要的。

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

代码语言:javascript
复制
var baseUrl = '@Url.Action("DownloadFileCSV", "Home")';
var queryString = $.param(data);
window.location = baseUrl + '?' + queryString;

但是,还不清楚为什么要对方法进行2次调用-- ajax调用,然后是重定向( ajax调用根本不做任何事情)。

票数 2
EN

Stack Overflow用户

发布于 2017-02-21 11:05:12

用作查询参数的任何内容都应该正确编码URI,特别是使用类似于JSON的内容:

代码语言:javascript
复制
window.location + "?SearchCriteria=" + encodeURIComponent(JSON.stringify(this.JsonData));

我不确定模型绑定器是否设计用于将GET请求中的JSON转换为类实例,但您前面所做的尝试肯定不是可行的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42364825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档