Изучение автоматически созданных сведений и методов удаления
Примечание
Обновленная версия этого руководства доступна здесь , используя последнюю версию Visual Studio. В новом руководстве используется ASP.NET Core MVC, который предоставляет множество улучшений по сравнению с этим руководством.
В этом руководстве описывается модель MVC ASP.NET Core с контроллерами и представлениями. Razor Pages — это новая альтернатива в ASP.NET Core, модель программирования на основе страниц, которая упрощает и повышает эффективность создания пользовательского веб-интерфейса. Мы рекомендуем ознакомиться с руководством по Razor Pages до версии MVC. Руководство по Razor Pages:
- проще для выполнения;
- охватывает дополнительные возможности;
- Предпочтительный подход к разработке новых приложений.
В этой части учебника вы изучите автоматически созданные Details
методы и Delete
.
Изучение методов Details и Delete
Movie
Откройте контроллер и проверьте Details
метод .
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
Модуль формирования шаблонов MVC, создавший этот метод действия, добавляет комментарий, показывающий HTTP-запрос, который вызывает метод . В этом случае это GET
запрос с тремя сегментами URL-адресов, Movies
контроллером, методом Details
и значением ID
.
Code First упрощает поиск данных с помощью Find
метода . Важная функция безопасности, встроенная в метод , заключается в том, что код проверяет, Find
что метод нашел фильм, прежде чем код попытается что-либо сделать с ним. Например, злоумышленник может внести ошибки на сайт путем изменения созданного ссылками URL-адреса с http://localhost:xxxx/Movies/Details/1
на что-то вроде http://localhost:xxxx/Movies/Details/12345
(или любое другое значение, которое не представляет фактический фильм). Если вы не проверка для фильма со значением NULL, это приведет к ошибке базы данных.
Просмотрите методы Delete
и DeleteConfirmed
.
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Movie movie = db.Movies.Find(id);
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
Обратите внимание, что метод HTTP GET Delete
не удаляет указанный фильм, а возвращает представление фильма, в котором можно отправить (HttpPost
) удаление. Выполнение операции удаления в ответ на запрос GET (или выполнение операции редактирования, создания или любой другой операции, изменяющей данные) открывает брешь в системе безопасности. Дополнительные сведения об этом см. в записи блога Стивена Уолтера ASP.NET MVC Совет No 46 — не используйте удалить ссылки, так как они создают отверстия в системе безопасности.
Метод HttpPost
, который удаляет данные, называется DeleteConfirmed
, поэтому метод HTTP POST обладает уникальной сигнатурой или именем. Ниже приведены сигнатуры двух методов:
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
Требуется, чтобы в среде CLR перегруженные методы имели уникальную сигнатуру параметров (то же имя метода, но другой список параметров). Однако здесь вам потребуется два метода Delete — один для GET и один для POST, которые имеют одинаковую сигнатуру параметра. (Они оба должны принимать целочисленное значение в качестве параметра.)
Чтобы разобраться в этом, вы можете сделать несколько вещей. Один из них заключается в том, чтобы присвоить методам разные имена. Именно это было представлено в предыдущем примере механизма формирования шаблонов. Но в этом случае возникает небольшая проблема: ASP.NET сопоставляет сегменты URL-адреса с методами действий по имени, а при переименовании метода, как правило, маршрутизация не сможет найти этот метод. Решение показано в примере, а именно: в метод DeleteConfirmed
следует добавить атрибут ActionName("Delete")
. Это эффективно выполняет сопоставление для системы маршрутизации, чтобы URL-адрес, содержащий /Delete/ для запроса POST, нашел DeleteConfirmed
метод .
Еще один распространенный способ избежать проблем с методами с одинаковыми именами и сигнатурами — искусственное изменение сигнатуры метода POST для включения неиспользуемого параметра. Например, некоторые разработчики добавляют тип FormCollection
параметра, который передается в метод POST, а затем просто не используют параметр :
public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
Итоги
Теперь у вас есть полное ASP.NET приложение MVC, которое хранит данные в локальной базе данных базы данных. Вы можете создавать, читать, обновлять, удалять фильмы и искать их.
Next Steps
После создания и тестирования веб-приложения необходимо сделать его доступным для других пользователей через Интернет. Для этого необходимо развернуть его у поставщика услуг веб-хостинга. Корпорация Майкрософт предлагает бесплатное веб-размещение до 10 веб-сайтов в бесплатной пробной учетной записи Azure. Далее я предлагаю вам выполнить инструкции из моего учебника Развертывание безопасного приложения MVC ASP.NET с членством, OAuth и База данных SQL в Azure. Отличным учебником является создание модели данных Entity Framework для ASP.NET приложения MVC среднего уровня Тома Дайкстры. Stackoverflow и форумы ASP.NET MVC отлично подходят для вопросов. Следите за мной в Twitter, чтобы вы могли получать обновления о моих последних учебниках.
Мы приветствуем отзыв.
— Рик Андерсон twitter: @RickAndMSFT
— Скотт Хансельман twitter: @shanselman
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по