Удаление строки из базы данных SQL Server в ASP.NET MVC

Я работаю над приложением ASP.NET MVC и столкнулся с проблемой удаления строк.

Вот конкретный сценарий: у меня есть две таблицы базы данных: AvailableDates и Bookings.

В пользовательском интерфейсе пользователи могут просматривать доступные даты. Когда пользователь выбирает дату для удаления, система должна удалить соответствующую строку из таблицы Bookings (включая выбранную дату, дату отправки и имя пользователя).

Я добавил кнопку «Подтвердить отмену», чтобы начать процесс удаления. Нажатие этой кнопки приводит к ошибке 404:

Эта страница локального хоста не найдена. Веб-страница по веб-адресу: https://localhost:44355/Booking/ConfirmCancelBooking не найдена.

Как устранить ошибку 404 и убедиться, что действие ConfirmCancelBooking правильно обрабатывает процесс удаления?

Модели:

public class AvailableDate
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
}

public class Booking
{
    public int Id { get; set; }
    public string Username { get; set; }
    public DateTime SelectedDate { get; set; }
    public DateTime SubmissionDate { get; set; }
}

Контроллер:

public class BookingController : Controller
{
    private readonly MyDbContext _context;

    public BookingController(MyDbContext context)
    {
        _context = context;
    }

    public IActionResult CancelBooking(int bookingId)
    {
        string fullUsername = User.Identity.Name; 

        var booking = _context.Bookings.SingleOrDefault(b => b.Id == bookingId && b.Username == fullUsername);

        if (booking == null)
        {
            return NotFound();
        }

        return View(booking);
    }

    [HttpPost]
    public IActionResult ConfirmCancelBooking(int bookingId)
    {
        string fullUsername = User.Identity.Name; 

        var booking = _context.Bookings.SingleOrDefault(b => b.Id == bookingId 
                                                             && b.Username == fullUsername);

        if (booking == null)
        {
            return NotFound();
        }

        _context.Bookings.Remove(booking);
        _context.SaveChanges();

        return RedirectToAction("Index");
    }
}

Вид:

@{
    ViewBag.Title = "Cancel Booking";
}

<h2>Cancel Booking</h2>

<p>Are you sure you want to cancel your booking for @Model.SelectedDate?</p>

@using (Html.BeginForm("ConfirmCancelBooking", "Booking", FormMethod.Post))
{
    @Html.HiddenFor(model => model.Id)
    <input type = "submit" value = "Confirm Cancellation" class = "btn btn-danger" />
    <a href = "@Url.Action("Index", "Booking")" class = "btn btn-secondary">Back to Bookings</a>
}

Судя по опубликованному вами URL-адресу, вы, похоже, не передаете параметр bookingId.

Ross Bush 08.08.2024 14:13

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

Peppermintology 08.08.2024 14:17

Пробовали [HttpPost("ConfirmCancelBooking")]? Теперь для метода можно определить путь по умолчанию для контроллера с помощью метода POST (без ConfirmCancelBooking в пути). Более того, вы можете использовать для этого метод HTTP DELETE [HttpDelete("ConfirmCancelBooking")]

Michał Turczyn 08.08.2024 14:55

Я на самом деле попробовал, но это не сработало. Я добавил вид здесь.

Josh 08.08.2024 17:08

Почему бы вам просто не выполнить отладку и не найти причину ошибки?

Dale K 08.08.2024 22:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема может быть связана с добавленным вами перенаправлением на действие. Я изменил тип возврата и удалил перенаправление в конце

Также похоже, что вы забыли указать идентификатор бронирования.

[HttpPost]
public Task<bool> ConfirmCancelBooking([FromBody] int bookingId)
{
   string fullUsername = User.Identity.Name; 

   var booking = _context.Bookings.SingleOrDefault(b => b.Id == bookingId && b.Username ==        fullUsername);
   if (booking == null)
   {
       return false();
   }

   _context.Bookings.Remove(booking);
   _context.SaveChanges();

   return true;
}

Это единственный элемент, который позволяет вам перемещаться. Если это не решит вашу проблему, обновите и добавьте код кнопки.

Также вы можете просто сделать _context.Remove(booking), это работает так же, как _context.Bookings.Remove(booking)

Привет @Kaiwinta, спасибо за совет! Я виноват, что не упомянул вид раньше.

Josh 08.08.2024 22:21
Ответ принят как подходящий

Однако в вашем действии ConfirmCancelBooking параметром является bookingId по следующим причинам:

@Html.HiddenFor(model => model.Id)

Имя скрытого ввода будет id, что означает, что значение bookingId при попадании в действие контроллера будет 0.

Итак, когда вы выполняете запрос к базе данных:

var booking = _context
                .Bookings
                .SingleOrDefault(b => b.Id == bookingId 
                    && b.Username == fullUsername);

Вы будете искать Booking с Id из 0, в существовании которого я сомневаюсь. Это будет означать, что var booking есть null и, следовательно, ваша отметка bookingnull под ним будет true, что приведет к 404.

Попробуйте изменить его на следующее:

public IActionResult ConfirmCancelBooking(int id)
{
  // Your code
}

Несколько предложений.

  1. Напишите короткое, но содержательное ответное сообщение со своим NotFound. Например:
return NotFound($"No booking found for ID {id}");
  1. Используйте ILogger, чтобы добавить вывод журнала для помощи в отладке.

Спасибо, @Peppermintology, за исправления! Они полностью сработали. Также оцените предложения.

Josh 08.08.2024 22:18

Другие вопросы по теме

Похожие вопросы