【问题标题】:Making HTTP Get call from Ajax to an MVC Controller, parameter is a complex Json object shows as null从 Ajax 对 MVC 控制器进行 HTTP Get 调用,参数是一个复杂的 Json 对象,显示为 null
【发布时间】:2017-02-21 15:29:05
【问题描述】:

我有三门课

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

以下是我的控制器代码:

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

上面的代码确实有效,并且下载了测试文件 somefile.pdf。

我的问题:

在控制器中,我期望 MainSearch 对象被填充。目前没有发生这种情况。检查类 SearchData 和 SearchMode 是否设置为 null。

我该如何解决这个问题?

抱歉,忘记添加 Json。

      var JsonData = {
            "searchMode":
                {
                    "mode": "1",
                    "pageSize": "5",
                    "pageNumber": "1",
                    "sortField": "PodRef",
                    "sortDirection": "desc",
                    "userURN": "3175",
                },
            "searchData":
                {
                    "ticketNumberCompare": "1",
                    "ticketSearchTextFrom": "From A",
                    "ticketSearchTextTo": "To Z"
                }
        };

【问题讨论】:

  • 你试过data: { "search": JsonData }吗?
  • 是的,我有,但它什么也没做
  • 我刚刚意识到您似乎调用了两次相同的操作方法(一次通过 Ajax,一次通过 window.location)。为什么是这样?当然只需要第二次调用。而对于第二个,您不能将这样的 JSON 数据直接提交到查询字符串中。你最好序列化对象。
  • 这是 Ajax 调用返回文件的 MVC 控制器操作的怪癖。请看链接stackoverflow.com/questions/30704078/…

标签: javascript jquery json ajax asp.net-mvc-4


【解决方案1】:

将 JsonProperty 与两个 Model Like 一起使用:

public class SearchData
{
    [JsonProperty(PropertyName = "ticketNumberCompare")]
    public int? ticketNumberCompare { get; set; }
    [JsonProperty(PropertyName = "ticketSearchTextFrom")]
    public string ticketSearchTextFrom { get; set; }
    [JsonProperty(PropertyName = "ticketSearchTextTo")]
    public string ticketSearchTextTo { get; set; }
}

并使用视图模型 Like

public class JsonData
{
    public SearchMode SearchMode{get;set;}
    public SearchData SearchData {get;set;}
}

在行动中像这样使用

[HttpGet]
public ActionResult DownloadFileCSV(JsonData search)
{
    string fileName = Server.MapPath("~/Content/Pdf/") + "somefile.pdf";
    byte[] fileContents = System.IO.File.ReadAllBytes(fileName);
    return File(fileContents, "application/pdf", "result.pdf");
}

【讨论】:

  • Dharmesh,除非我错过了什么,否则这是行不通的,我已经更改了我的代码以匹配上述内容。我需要以任何方式更改 ajax 调用吗?
  • 你需要从 data:JsonData 改为 data:JSON.stringify({ JsonData: JsonData })
  • 这并没有解决以下根本问题:a) 在这种情况下不需要 ajax,b) 对 window.location 的调用不起作用,因为您无法在查询字符串上传递原始 JSON。请参阅建议的重复答案。
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 2016-02-14
  • 2020-08-22
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 2016-08-11
  • 2017-07-16
相关资源
最近更新 更多