2017-02-21 17 views
-1

У меня есть три классаСоздание HTTP Получить вызов от Ajax к контроллеру MVC, параметр представляет собой сложный объект Json показывает утратившим

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

И, наконец, , вызов 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); 
      } 
     }); 
    }); 

Приведенный выше код действительно работает и загружен тестовый файл 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" 
       } 
     }; 
+0

вы пробовали ' data: {"search": JsonData} '? – ADyson

+0

Да, у меня есть и ничего не делает – gilesrpa

+0

Я только что понял, что вы вызываете один и тот же метод действий дважды (один раз через Ajax и один раз через window.location). Почему это? Конечно, требуется только второй вызов. А для второго вы не можете передавать данные JSON прямо в запрос. Вам лучше сериализовать объект. – ADyson

ответ

-1

использование JsonProperty с обеих модели, как:

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

Dharmesh, если я не пропустил что-то, это не сработает, я изменил свой код, чтобы соответствовать вышеизложенному. Мне нужно каким-либо образом изменить вызов ajax? – gilesrpa

+0

вам необходимо изменить данные: JsonData для данных: JSON.stringify ({JsonData: JsonData}) –

+0

Это не затрагивает фундаментальную проблему: a) ajax не нужен в этой ситуации и b) вызов window.location не работает, потому что вы не можете передать сырой JSON на запрос. См. Предлагаемый дублированный ответ. – ADyson