2017-02-21 77 views
1

我下面的对象,我传递到MVC控制器:的Javascript Windows.Location传递复杂JSON对象

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] 

由于未找到错误两个以上的页面。

UPDATE:

我已经在寻求一个答案前移。

好,根据helpers的请求,我已经包含更多的源代码。

我有三个类。

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

最后,Ajax调用即发来自cshtml文件。

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

这是真的吗?您使用的查询参数应该是正确的URI

+0

您可以将一个复杂的javascript对象传递给GET方法。您调用的方法的签名是什么? –

+0

它使用HttpGet在MVC控制器上的动作 – gilesrpa

+0

是的,我知道 - 该方法的签名又是什么(如果它的模型,显示该模型) –

回答

0

您无法将复杂的JavaScript对象传递给GET方法。一个GET没有主体并且绑定到一个模型,你的查询字符串名/值对必须匹配你绑定的对象的属性。例如绑定到的MainSearchSearchMode属性的mode属性,查询字符串将需要您使用生成的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包括

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

更改代码代码

$.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()方法中的代码从不使用模型的任何值。它返回一个FileResult不能用Ajax调用工作(但它可以与window.location工作,这这种情况下,在成功回调的代码将需要

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

但随后其原因尚不清楚你在做2调用方法 - ajax调用,然后是重定向(ajax调用什么也不做)

0

任何编码的,尤其是像JSON:

window.location + "?SearchCriteria=" + encodeURIComponent(JSON.Stringify(this.JsonData)); 

我不知道该模型粘合剂被设计成JSON转换成一个GET请求到类实例,但上面所做的尝试绝对不是要走的路。

+0

试过JL,仍然没有工作 – gilesrpa