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

Рик Андерсон

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

Улучшение методов 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