Поделиться через


Изучение методов действий "Сведения" и "Удаление"

Рик Андерсон

Примечание.

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

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

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