Json неправильно привязан как объект c # - PullRequest
0 голосов
/ 25 июня 2018

Мое приложение сделано в ASP.NET MVC 5.Пользователь может использовать форму поиска, которая отображает отфильтрованные данные.Теперь я хочу добавить кнопку, которая будет экспортировать отображаемые данные.

Для этого я отправляю объект Search для просмотра и сохраняю его в формате HTML.Теперь, нажимая кнопку экспорта, я хочу передать этот объект в контроллер, получить данные из базы данных, используя этот объект Search, и сохранить результаты как text.

Дело в том, что я не могу связать json с c# объектом,Вот мой view:

<div id="originalForm" style="visibility:hidden">
    @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model))
</div>

Это мой ajax код:

function exportRaportToCsv() {
    var $formData = $('#originalForm').text();
    var allIds = getCheckedIds();

    var dataToSend = JSON.stringify({
        ids: allIds,
        search: $formData
    });


    $.ajax({
        type: "POST",
        url: '@Url.Action("ExportToCsv", "BankCosts")',
        data: dataToSend,
        contentType: "application/json; charset=utf-8",
        success: function (datar) {
            window.location = '/BankCosts/Download?fileGuid=' + response.FileGuid
                + '&filename=' + response.FileName;
        },
        error: function (xhr) {
        },
    });
}

А это мой контроллер:

[HttpPost]
public ActionResult ExportToCsv(string[] ids, Search search)
{
    // search is null here
}

Когда я шпионюотправляя данные с Fiddler Я вижу, что я передаю следующее:

{"ids":[],"search":"\n    {\"ID\":0,\"DateFrom\":\"2018-06-23T00:00:00\",\"DateTo\":\"2018-06-25T00:00:00\",\"hasUnrecognizedStatus\":false,\"skippedSearchResults\":0,\"paginationLimit\":100}\n"}

Я думаю, стоит упомянуть, что ids правильно передано.Если он содержит данные, эти данные передаются.Я думаю, проблема в том, что у меня \ в моем json.Как я могу удалить это?Что-то не так с моим ajax?

Когда я использую console.log для печати $formData, я вижу, что \ символов больше нет, и выглядит лучше:

{"ID":0,"DateFrom":"2018-06-23T00:00:00","DateTo":"2018-06-25T00:00:00","hasUnrecognizedStatus":false,"skippedSearchResults":0,"paginationLimit":100}

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

Используйте JSON.parse () для преобразования строки JSON в объект JavaScript. Ваш $ ('# originalForm'). Text () на самом деле является строкой JSON.

        var $formData = JSON.parse($('#originalForm').text());
        var allIds = getCheckedIds();

       var dataToSend = JSON.stringify({
            ids: allIds,
            search: $formData
            });

В вашем случае, $ formData - это строка (фактически, строка JSON). Поэтому JSON.stringify () снова пытается преобразовать в строку JSON, которая уже является строкой JSON, которая вызывает ненужный символ «/» в данных формы, которые вы публикуете.

Убедитесь, что в свойствах вызова ajax установлен тип содержимого 'application / json'. В противном случае связыватель модели MVC не сможет отобразить и заполнить модель .NET из опубликованных данных JSON. contentType: "application / json; charset = utf-8",

0 голосов
/ 25 июня 2018
[HttpPost]
public ActionResult ExportToCsv(string[] ids,[FromBody]Search search)
{
}

Попробуйте добавить FromBody, если ваша модель поиска в порядке, она должна работать.

0 голосов
/ 25 июня 2018

основываясь на ваших комментариях, я думаю, что поисковый объект уже заштрихован, поэтому вам не нужно его зашифровывать.

просто сделай свой JSON вот таким

var dataToSend = {
    "ids": allIds,
    "search": $formData
};
0 голосов
/ 25 июня 2018

Так как вы используете

JSON.stringify

значение поиска размещено в строковом формате, а не объект

Поиск

так

Попробуйте заменить контроллер на этот

[HttpPost]
public ActionResult ExportToCsv(string[] ids, string search)
{
  //then deserialize search json like
  Search objSearch = JsonConvert.DeserializeObject<Search>(search);
}

или

     [HttpPost]
     public ActionResult ExportToCsv(string[] ids, JObject search)
    {
  //then deserialize search json like
     Search objSearch = JsonConvert.DeserializeObject<Search > 
    (dataModel["search"].ToString());

}

View

$.ajax({
    type: "POST",
    url: '@Url.Action("ExportToCsv", "BankCosts")',
    data:{ids= allIds.toString(),search:JSON.stringify($formData)}
    contentType: "application/json; charset=utf-8",
    success: function (datar) {
        window.location = '/BankCosts/Download?fileGuid=' + response.FileGuid
            + '&filename=' + response.FileName;
    },
    error: function (xhr) {
    },
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...