Udostępnij za pośrednictwem


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:

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.

Zrzut ekranu przedstawiający stronę Indeks wyszukiwania w aplikacji filmowej M V C. Na stronie zostanie wyświetlona lista czterech filmów.

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:

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