Ulepszanie metod Details i Delete (VB)
Autor: Rick Anderson
Ten samouczek zawiera podstawowe informacje na temat tworzenia aplikacji internetowej MVC ASP.NET przy użyciu dodatku Microsoft Visual Web Developer 2010 Express Service Pack 1, który jest bezpłatną wersją programu Microsoft Visual Studio. Przed rozpoczęciem upewnij się, że zostały zainstalowane wymagania wstępne wymienione poniżej. Wszystkie te elementy można zainstalować, klikając następujący link: Instalator platformy internetowej. Alternatywnie można indywidualnie zainstalować wymagania wstępne, korzystając z następujących linków:
- Wymagania wstępne programu Visual Studio Web Developer Express SP1
- aktualizacja narzędzi ASP.NET MVC 3
- SQL Server Compact 4.0 (środowisko uruchomieniowe i obsługa narzędzi)
Jeśli używasz programu Visual Studio 2010 zamiast Visual Web Developer 2010, zainstaluj wymagania wstępne, klikając następujący link: Wymagania wstępne programu Visual Studio 2010.
Projekt Visual Web Developer z kodem źródłowym VB.NET jest dostępny do dołączenia do tego tematu. Pobierz wersję VB.NET. Jeśli wolisz język C#, przejdź do wersji języka C# tego samouczka.
W tej części samouczka wprowadzisz pewne ulepszenia dotyczące automatycznie generowanych Details
metod i Delete
. Te zmiany nie są wymagane, ale za pomocą kilku małych fragmentów kodu można łatwo ulepszyć aplikację.
Ulepszanie metod szczegółów i usuwania
Po utworzeniu szkieletu Movie
kontrolera ASP.NET wygenerowany kod MVC, który działał świetnie, ale może to być bardziej niezawodne z zaledwie kilkoma małymi zmianami.
Otwórz kontroler i zmodyfikuj Movie
Details
metodę, zwracając HttpNotFound
ją, gdy nie znaleziono filmu. Należy również zmodyfikować metodę Details
, aby ustawić wartość domyślną identyfikatora przekazanego do tej metody. (Wprowadzono podobne zmiany do Edit
metody w części 6 tego samouczka). Należy jednak zmienić zwracany typ Details
metody z ViewResult
na ActionResult
, ponieważ HttpNotFound
metoda nie zwraca ViewResult
obiektu. W poniższym przykładzie przedstawiono zmodyfikowaną Details
metodę.
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
Funkcja Code First ułatwia wyszukiwanie danych przy użyciu Find
metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy Find
metoda znalazła film, zanim kod spróbuje wykonać z nim wszystko. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:xxxx/Movies/Details/1
na coś http://localhost:xxxx/Movies/Details/12345
podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, może to spowodować błąd bazy danych.
Podobnie zmień Delete
metody i DeleteConfirmed
, aby określić wartość domyślną parametru ID i zwrócić HttpNotFound
, gdy film nie zostanie znaleziony. Zaktualizowane Delete
metody w kontrolerze Movie
są pokazane poniżej.
' 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
Pamiętaj, że Delete
metoda nie usuwa danych. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.
Metoda HttpPost
, która usuwa dane, jest nazwana DeleteConfirmed
w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa podpisy metody:
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
Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążonych metod, aby mieć unikatowy podpis (taką samą nazwę, inną listę parametrów). Jednak w tym miejscu potrzebne są dwie metody Usuwania — jedna dla metody GET i druga dla żądania POST — które wymagają tego samego podpisu. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).
Aby to zrobić, możesz zrobić kilka rzeczy. Jednym z nich jest nadanie metodom różnych nazw. To właśnie zrobiliśmy w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")
DeleteConfirmed
do metody . To skutecznie wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/dla żądania POST znaleźć metodę DeleteConfirmed
.
Innym sposobem uniknięcia problemu z metodami, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia nieużywanego parametru. Na przykład niektórzy deweloperzy dodają typ FormCollection
parametru, który jest przekazywany do metody POST, a następnie po prostu nie używają parametru:
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
Zawijanie
Masz teraz kompletną aplikację MVC ASP.NET, która przechowuje dane w bazie danych SQL Server Compact. Możesz tworzyć, odczytywać, aktualizować, usuwać i wyszukiwać filmy.
W tym podstawowym samouczku rozpoczęto tworzenie kontrolerów, kojarzenie ich z widokami i przekazywanie zakodowanych danych. Następnie utworzono i zaprojektowano model danych. Program Entity Framework Code Najpierw utworzył bazę danych na podstawie modelu danych na bieżąco, a system tworzenia szkieletów MVC ASP.NET automatycznie wygenerował metody akcji i widoki podstawowych operacji CRUD. Następnie dodano formularz wyszukiwania, który umożliwia użytkownikom przeszukiwanie bazy danych. Baza danych została zmieniona tak, aby zawierała nową kolumnę danych, a następnie zaktualizowała dwie strony, aby utworzyć i wyświetlić te nowe dane. Dodano walidację, oznaczając model danych atrybutami z DataAnnotations
przestrzeni nazw. Wynikowa walidacja jest uruchamiana na kliencie i na serwerze.
Jeśli chcesz wdrożyć aplikację, warto najpierw przetestować aplikację na lokalnym serwerze usług IIS 7. Możesz użyć tego linku Instalatora platformy sieci Web, aby włączyć ustawienie usług IIS dla aplikacji ASP.NET. Zobacz następujące linki wdrażania:
- mapa zawartości wdrożenia ASP.NET
- Włączanie usług IIS 7.x
- Wdrażanie projektów aplikacji internetowych
Zachęcam teraz do przejścia do naszego pośredniego poziomu Tworzenie modelu danych platformy Entity Framework na potrzeby ASP.NET samouczków aplikacji MVC i MVC Music Store , aby zapoznać się z artykułami ASP.NET w witrynie MSDN oraz zapoznać się z wieloma filmami i zasobami, https://asp.net/mvc aby dowiedzieć się więcej o ASP.NET MVC! Fora ASP.NET MVC to doskonałe miejsce do zadawania pytań.
Owocnej pracy.
— Scott Hanselman (http://hanselman.comi @shanselman na Twitterze) i Rick Anderson blogs.msdn.com/rickAndy