Как сделать запрос на публикацию без формы и без получения ошибки 400

#javascript #asp.net #asp.net-mvc

Вопрос:

Я отправляю запрос на публикацию без формы в asp.net. Я получаю ошибку 400.

АЯКС

 function deteleCategorieBtn(id) {
if (confirm("Are you sure you want to delete ?")) {
    $.ajax({
        type: "POST",
        url: 'categories/delete/'   id,
        success: function () {
            var dataTable = $('#kt_datatable').DataTable();
            dataTable.ajax.reload(null, false);    
        },
        error: function (request, error) {
            console.log(request, error);
        }
    })
}
 

контроллер

 // POST: Categories/Delete/5
        [Route("delete/{id?}")]
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Delete(int id)
        {
            var category = await _context.Categories
                   .FirstOrDefaultAsync(m => m.Id == id);
            if(category != null){
                _context.Categories.Remove(category);
                await _context.SaveChangesAsync();
            }
            else
            {
                return Json(new { error = true, messages = "Categorie doesn't exist" }, new Newtonsoft.Json.JsonSerializerSettings());
            }

            return Json(new { success = true, messages = "Registered well" }, new Newtonsoft.Json.JsonSerializerSettings());
        }
    }
 
  • На консоли правильный URL-адрес
  • Я попытался изменить тип с POST на DELETE в части ajax, и HttpPost на HttpDelete — Не сработало
  • Я успешно использовал тот же код контроллера с формой, которая выглядит так :
 <form asp-action="Delete" asp-route-id="@item.Id" onclick="return confirm('Are you sure you want to delete ? ?');">
      <button type="submit" value="Delete" class="btn btn-sm btn-clean btn-icon"></button>
</form>
 

Редактировать :
Найдено это сообщение об ошибке :

 System.InvalidOperationException: The provider for the source IQueryable doesn't implement IDbAsyncQueryProvider. Only providers that implement IDbAsyncQueryProvider can be used for Entity Framework asynchronous operations.
 

Комментарии:

1. Привет. Я не уверен, как выглядят атрибуты класса контроллера, но мне кажется, что это может быть проблемой: // СООБЩЕНИЕ: Категории/Удалить/5 [Маршрут(«удалить/{идентификатор?}»)] — вы пропускаете часть пути «категории».

2. У меня есть «[Маршрут(«категории»)] общедоступный класс CategoriesController : Контроллер« вверху, маршрутизация работает хорошо

3. Да, я думаю, что в этом может быть проблема. Один из вариантов-сделать вызов AJAX типа DELETE для категорий/идентификаторов URL, но я в этом не уверен, и вы, вероятно, этого не хотите. Я считаю, что правильным решением этой проблемы является не использование атрибута МАРШРУТА на уровне класса, а использование атрибута RoutePrefix — [RoutePrefix(«категории»)] … класс : Контроллер { … [Маршрут(«Удалить/{идентификатор?}»] … метод…

4. P. s.: Проверьте правильный адрес ЗАПИСИ рабочей формы в инструментах разработчика…

5. Я не знаю, в этом ли проблема, как описано в моем посте, я могу с помощью формы правильно удалить код контроллера. Уже пробовал ajax, сделав вызов на УДАЛЕНИЕ

Ответ №1:

Вам необходимо добавить маркер защиты от подделки при отправке ajax.

Добавьте на свою страницу антивирусный токен, как показано ниже

 @Html.AntiForgeryToken()
 

Это будет добавлено в скрытое поле ввода

При отправке сообщения ajax отправьте токен, как показано ниже

 $.ajax({
        type: "POST",
        url: 'categories/delete/'   id,
        beforeSend: function (xhr) {
            xhr.setRequestHeader('XSRF-TOKEN',
                $('input:hidden[name="__RequestVerificationToken"]').val());
        },
    success: function () {
        var dataTable = $('#kt_datatable').DataTable();
        dataTable.ajax.reload(null, false);    
    },
    error: function (request, error) {
        console.log(request, error);
    }
    });
 

Комментарии:

1. Все еще получил сообщение об ошибке и обнаружил, что AntiForgeryToken жестко закодирован для использования с формой. Добавлена информация к вопросу

2. @Джоэл, теперь проблема с 400 решена?. И какого поставщика вы используете для своей базы данных?

3. О да ! Это решено, но теперь у меня ошибка 500. Спасибо

4. Какое пространство имен вы используете для использования метода расширения FirstOrDefault?.

5. Мне удалось устранить ошибку. Я забыл, что это было, но это было что-то глупое, что я забыл. Это ваше решение открыло мне глаза и решило главную проблему