Изучение методов Details и Delete (VB)
В этом руководстве описаны основы создания веб-приложения MVC ASP.NET MVC с помощью Microsoft Visual Web Developer 2010 Express с пакетом обновления 1 (SP1), который является бесплатной версией Microsoft Visual Studio. Перед началом работы убедитесь, что вы установили необходимые компоненты, перечисленные ниже. Все их можно установить, щелкнув следующую ссылку: установщик веб-платформы. Кроме того, можно установить предварительные требования по отдельности, используя следующие ссылки:
- Предварительные требования для Visual Studio Web Developer Express с пакетом обновления 1 (SP1)
- обновление средств MVC 3 ASP.NET
- SQL Server Compact 4.0(среда выполнения и средства поддержки)
Если вы используете 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