Ajax запрос с использованием json в проекте asp.net mvc

115
22 июня 2019, 18:20

Изучаю javascript. Дошёл до ajax запросов. Есть у меня запрос написанный с помощью jquery. Код view:

@{
    ViewBag.Title = "Index";
}
<div>
    <input type="text" name="name" id="txt" />
    <input type="button" id="btn" class="edit" value="Отправить" />
    @section scripts {
        <script type="text/javascript">
            $('#btn').on('click', function () {
                var message = { "name": $('#txt').val() };
                $.ajax({
                    type: "POST",
                    url: "/Home/BookSearch",
                    data: JSON.stringify(message),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (data) {
                        alert('Успех');
                        $('#results').html(data);
                    },
                    error: function (xhr) {
                        alert(xhr.status + 'Ошибка');
                    }
                });
            });
        </script>
    }
    <div id="results"></div>
</div>

Сначала я пробовал передавать не преобразуя строковую перменную в json а прям в виде стринга и передавал. Всё нормально запрос отрабатывает возвращает success. Попробовал так как сейчас в коде. Запрос выполняется возвращает искомый результат, но почему то далее идёт в функцию error но при этом я проверяю xhr.status или в c# ещё есть enum HttpStatusCode и этот статус равен 200, что эквивалентно ОК. Так почему же тогда выходит в ветку ошибки? А вот если я уберу из этого запроса строчку dataType: "json", тогда всё отработает так же хорошо как вообще без json. Не понимаю почему так происходит. Вот код моего контроллера если он нужен:

Context db = new Context();
        public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        public ActionResult BookSearch(string name)
        {
            var allbooks = db.Books.Where(a => a.Author.Contains(name)).ToList();
            if (allbooks.Count <= 0)
            {
                return HttpNotFound();
            }
            return View(allbooks);
        }
Answer 1

Потому что строчкой

dataType: "json",

Вы явно говорите, что ожидаете ответ в виде JSON. А возвращаете View, то есть - html. Этот текст не может быть преобразован в объект javascript-a, поэтому уже на клиенте (после успешного прихода туда html) происходит ошибка парсинга. Уберите эту строчку или замените ее на

dataType: "html",

Если бы Вы возвращали ответ действительно в виде JSON, то параметр data в обработчике success был бы объектом. Для dataType: "html" или "text" этот параметр - строка.

READ ALSO
В чем разница при вызове переменных?

В чем разница при вызове переменных?

В чём разница использования следующих вызовов переменных? Как я понял, одни из них устарели и не безопасны, но в чём это заключается я так...

109
PHP удалённое подключение к MySQL

PHP удалённое подключение к MySQL

положил страницу с вот таким php скриптом на удалённый хостинг

143
Sumfony console, как читать stdin

Sumfony console, как читать stdin

Пишу простое консольное приложение с командами на основе классов Symfony\Component\Console\Command\Command

130