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


Изучение методов Details и Delete (VB)

Рик Андерсон

В этом руководстве описаны основы создания веб-приложения MVC ASP.NET MVC с помощью Microsoft Visual Web Developer 2010 Express с пакетом обновления 1 (SP1), который является бесплатной версией Microsoft Visual Studio. Перед началом работы убедитесь, что вы установили необходимые компоненты, перечисленные ниже. Все их можно установить, щелкнув следующую ссылку: установщик веб-платформы. Кроме того, можно установить предварительные требования по отдельности, используя следующие ссылки:

Если вы используете Visual Studio 2010 вместо Visual Web Developer 2010, установите необходимые компоненты, щелкнув следующую ссылку: предварительные требования Visual Studio 2010.

Проект Visual Web Developer с VB.NET исходный код доступен для сопровождения этого раздела. Скачайте версию VB.NET. Если вы предпочитаете C#, перейдите к версии C# этого руководства.

В этой части руководства вы внесете некоторые улучшения в автоматически созданные Details и Delete методы. Эти изменения не требуются, но с несколькими небольшими битами кода можно легко улучшить приложение.

Улучшение методов сведений и удаления

При создании контроллера ASP.NET созданного Movie MVC кода, который работал отлично, но это можно сделать более надежным с помощью всего нескольких небольших изменений.

Откройте контроллер и измените Movie Details метод, возвращая HttpNotFound , когда фильм не найден. Необходимо также изменить Details метод, чтобы задать значение по умолчанию для идентификатора, переданного в него. (Вы внесли аналогичные изменения в метод в Edit части 6 этого руководства.) Однако необходимо изменить возвращаемый тип Details метода на ViewResult ActionResult, так как HttpNotFound метод не возвращает ViewResult объект. В следующем примере показан измененный Details метод.

Public Function Details(Optional ByVal id As Integer = 0) As ActionResult
    Dim movie As Movie = db.Movies.Find(id)
    If movie Is Nothing Then
        Return HttpNotFound()
    End If
    Return View(movie)
End Function

Code First упрощает поиск данных с помощью Find метода. Важной функцией безопасности, встроенной в метод, является то, что код проверяет, Find найден ли метод фильм, прежде чем код пытается сделать что-либо с ним. Например, злоумышленник может внести ошибки на сайт путем изменения созданного ссылками URL-адреса с http://localhost:xxxx/Movies/Details/1 на что-то вроде http://localhost:xxxx/Movies/Details/12345 (или любое другое значение, которое не представляет фактический фильм). Если вы не проверяете наличие пустого фильма, это может привести к ошибке базы данных.

Аналогичным образом измените Delete и DeleteConfirmed методы, чтобы указать значение по умолчанию для параметра идентификатора и вернуться HttpNotFound , когда фильм не найден. Обновленные Delete методы в контроллере Movie показаны ниже.

' GET: /Movies/Delete/5

 Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
     Dim movie As Movie = db.Movies.Find(id)
     If movie Is Nothing Then
         Return HttpNotFound()
     End If
     Return View(movie)
 End Function

 '
 ' POST: /Movies/Delete/5

 <HttpPost(), ActionName("Delete")>
 Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult
     Dim movie As Movie = db.Movies.Find(id)
     If movie Is Nothing Then
         Return HttpNotFound()
     End If
     db.Movies.Remove(movie)
     db.SaveChanges()
     Return RedirectToAction("Index")
 End Function

Обратите внимание, что Delete метод не удаляет данные. Выполнение операции удаления в ответ на запрос GET (или выполнение операции редактирования, создания или любой другой операции, изменяющей данные) открывает брешь в системе безопасности.

Метод HttpPost, который удаляет данные, называется DeleteConfirmed, поэтому метод HTTP POST обладает уникальной сигнатурой или именем. Ниже приведены сигнатуры двух методов:

Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
 
 <HttpPost(), ActionName("Delete")>
 Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult

Среда CLR требует, чтобы перегруженные методы имели уникальную сигнатуру (то же имя, разные списки параметров). Однако здесь вам потребуется два метода Delete — один для GET и один для POST, для которых требуется одна сигнатура. (Они оба должны принимать целочисленное значение в качестве параметра.)

Чтобы отсортировать это, вы можете сделать пару вещей. Одним из них является предоставление различных имен методов. Это то, что мы сделали в предыдущем примере. Однако в этом случае возникает небольшая проблема: ASP.NET сопоставляет сегменты URL-адреса с методами действий по имени, а при переименовании метода, как правило, маршрутизация не сможет найти этот метод. Решение показано в примере, а именно: в метод DeleteConfirmed следует добавить атрибут ActionName("Delete"). Это эффективно выполняет сопоставление для системы маршрутизации, чтобы URL-адрес, включающий /Delete/for a POST-запрос, найти DeleteConfirmed метод.

Другой способ избежать проблемы с методами, имеющими идентичные имена и сигнатуры, заключается в том, чтобы искусственно изменить сигнатуру метода POST, чтобы включить неиспользуемый параметр. Например, некоторые разработчики добавляют тип FormCollection параметра, передаваемый методу POST, а затем просто не используют этот параметр:

Public Function Delete(ByVal fcNotUsed As FormCollection, Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
    Return HttpNotFound()
End If
db.Movies.Remove(movie)
db.SaveChanges()
Return RedirectToAction("Index")
End Function

Упаковка

Теперь у вас есть полное ASP.NET приложение MVC, которое хранит данные в базе данных SQL Server Compact. Вы можете создавать, читать, обновлять, удалять и искать фильмы.

Снимок экрана: страница

В этом базовом руководстве вы начали создавать контроллеры, связывать их с представлениями и передавать вокруг жестко закодированных данных. Затем вы создали и разработали модель данных. Entity Framework Code First создал базу данных из модели данных на лету, а система создания шаблонов MVC ASP.NET MVC автоматически создала методы действий и представления для основных операций CRUD. Затем вы добавили форму поиска, которая позволяет пользователям искать базу данных. Вы изменили базу данных, чтобы включить новый столбец данных, а затем обновили две страницы, чтобы создать и отобразить эти новые данные. Вы добавили проверку, пометив модель данных атрибутами из DataAnnotations пространства имен. Результирующая проверка выполняется на клиенте и на сервере.

Если вы хотите развернуть приложение, рекомендуется сначала протестировать приложение на локальном сервере IIS 7. Эту ссылку установщика веб-платформы можно использовать для включения параметров IIS для приложений ASP.NET. См. следующие ссылки на развертывание:

Теперь я призываю вас перейти к нашему промежуточному уровню создания модели данных Entity Framework для ASP.NET приложений MVC и MVC Music Store, чтобы ознакомиться с ASP.NET статьями в MSDN, а также ознакомиться с множеством видео и ресурсовhttps://asp.net/mvc, чтобы узнать еще больше о ASP.NET MVC! Форумы ASP.NET MVC — это отличное место для вопросов .

Вот и все!

— Скотт Ханселман (http://hanselman.comи @shanselman в Twitter) и Рик Андерсон blogs.msdn.com/rickAndy