Изучение методов действия Details и Delete

Рик Андерсон

Примечание

Здесь доступна обновленная версия этого руководства, использующая 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 (или любое другое значение, которое не представляет фактический фильм). Если вы не проверка для фильма со значением 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, которое хранит данные в локальной базе данных базы данных. Вы можете создавать, читать, обновлять, удалять фильмы и искать их.

Снимок экрана: страница индекса поиска фильмов M V C.

Next Steps

После создания и тестирования веб-приложения необходимо сделать его доступным для других пользователей через Интернет. Для этого необходимо развернуть его у поставщика услуг веб-хостинга. Корпорация Майкрософт предлагает бесплатное веб-размещение до 10 веб-сайтов в бесплатной пробной учетной записи Windows Azure. Далее я предлагаю вам выполнить инструкции из моего учебника Развертывание приложения MVC secure ASP.NET с членством, OAuth и База данных SQL на веб-сайте Windows Azure. Отличным учебником является создание модели данных Entity Framework для ASP.NET приложения MVC среднего уровня Тома Дайкстры. Stackoverflow и форумы ASP.NET MVC отлично подходят для вопросов. Следите за мной в Twitter, чтобы вы могли получать обновления о моих последних учебниках.

Мы приветствуем отзыв.

Рик Андерсон twitter: @RickAndMSFT
Скотт Хансельман twitter: @shanselman