#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. Мне удалось устранить ошибку. Я забыл, что это было, но это было что-то глупое, что я забыл. Это ваше решение открыло мне глаза и решило главную проблему