Изучение методов Details и Delete (VB)
В этом руководстве описаны основы создания веб-приложения ASP.NET MVC с помощью Microsoft Visual Web Developer 2010 Express с пакетом обновления 1 (SP1), который является бесплатной версией Microsoft Visual Studio. Перед началом работы убедитесь, что вы установили перечисленные ниже предварительные требования. Вы можете установить их все, щелкнув следующую ссылку: Установщик веб-платформы. Кроме того, вы можете установить необходимые компоненты по отдельности, используя следующие ссылки:
- Предварительные требования для Visual Studio Web Developer Express с пакетом обновления 1 (SP1)
- ASP.NET обновление средств MVC 3
- 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
. Эти изменения не требуются, но с помощью нескольких небольших фрагментов кода вы можете легко улучшить приложение.
Улучшение методов details и delete
При формировании шаблона контроллера Movie
ASP.NET код, созданный 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
(или любое другое значение, которое не представляет фактический фильм). Если вы не используете проверка для фильма со значением NULL, это может привести к ошибке базы данных.
Аналогичным образом измените Delete
методы и DeleteConfirmed
, чтобы указать значение по умолчанию для параметра ID и возвращать 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 (или выполнение операции редактирования, создания или любой другой операции, изменяющей данные) открывает брешь в системе безопасности. Дополнительные сведения об этом см. в записи блога Стивена Уолтера ASP.NET MVC Совет No 46 — не используйте удалить ссылки, так как они создают отверстия в системе безопасности.
Метод 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/для запроса 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 автоматически создала методы действий и представления для базовых операций CRUD. Затем вы добавили форму поиска, которая позволяет пользователям выполнять поиск в базе данных. Вы изменили базу данных, включив в нее новый столбец данных, а затем обновили две страницы, чтобы создать и отобразить эти новые данные. Вы добавили проверку, пометив модель данных атрибутами из DataAnnotations
пространства имен. Результирующая проверка выполняется на клиенте и на сервере.
Если вы хотите развернуть приложение, полезно сначала протестировать приложение на локальном сервере IIS 7. Вы можете использовать эту ссылку на установщик веб-платформы , чтобы включить параметр IIS для ASP.NET приложений. См. следующие ссылки на развертывание:
Теперь я призываю вас перейти к нашему среднему уровню Создание модели данных Entity Framework для ASP.NET приложения MVC и музыкального магазина MVC, чтобы изучить ASP.NET статьи на MSDN, а также проверка из множества видео и ресурсов на сайтеhttps://asp.net/mvc, чтобы узнать еще больше о ASP.NET MVC! Форумы ASP.NET MVC — отличное место для вопросов.
Желаем удачи!
— Скотт Хансельман (http://hanselman.com и @shanselman в Twitter) и Рик Андерсон blogs.msdn.com/rickAndy
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по