Изучение методов действий "Сведения" и "Удаление"
Примечание.
Обновленная версия этого руководства доступна здесь , где используется ASP.NET MVC 5 и Visual Studio 2013. Это более безопасно, гораздо проще следовать и демонстрирует больше функций.
В этой части руководства вы изучите автоматически созданные 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
(или любое другое значение, которое не представляет фактический фильм). Если вы не проверили наличие пустого фильма, то пустой фильм приведет к ошибке базы данных.
Просмотрите методы 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 (или выполнение операции редактирования, создания или любой другой операции, изменяющей данные) открывает брешь в системе безопасности.
Метод 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/for a 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 веб-сайтов в бесплатной пробной учетной записи Windows Azure. Я предлагаю вам следующее руководство по развертыванию приложения Secure ASP.NET MVC с членством, OAuth и База данных SQL на веб-сайте Windows Azure. Отличное руководство по созданию модели данных Entity Framework для приложения MVC Tom Dykstra промежуточно ASP.NET го уровня. Stackoverflow и ASP.NET форумы MVC являются отличными местами, чтобы задать вопросы. Следите за мной на twitter, чтобы вы могли получать обновления на моих последних учебниках.
Отзывы приветствуются.
— Рик Андерсон щебетать: @RickAndMSFT
— Скотт Ханселман щебетать: @shanselman