Ulepszanie metod Details i Delete (C#)

Autor: Rick Anderson

Uwaga

Zaktualizowana wersja tego samouczka jest dostępna tutaj, która używa ASP.NET MVC 5 i Visual Studio 2013. Jest ona bezpieczniejsza, znacznie łatwiejsza do naśladowania i demonstruje więcej funkcji.

W tym samouczku przedstawiono podstawy tworzenia aplikacji internetowej ASP.NET MVC przy użyciu programu 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 z nich 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 języka C# jest dostępny do dołączenia do tego tematu. Pobierz wersję języka C#. Jeśli wolisz program Visual Basic, przejdź do wersji Visual Basic tego samouczka.

W tej części samouczka wprowadzisz pewne ulepszenia automatycznie wygenerowane Details i Delete metody. Te zmiany nie są wymagane, ale za pomocą zaledwie 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 dzięki zaledwie kilku małym zmianom.

Otwórz kontroler i zmodyfikuj Details metodęMovie, zwracającHttpNotFound, gdy film nie zostanie znaleziony. Należy również zmodyfikować Details metodę, aby ustawić wartość domyślną identyfikatora przekazanego do niej. (Wprowadzono podobne zmiany w metodzie Edit w części 6 tego samouczka). Należy jednak zmienić typ zwracanej Details metody z ViewResult na ActionResult, ponieważ HttpNotFound metoda nie zwraca ViewResult obiektu. W poniższym przykładzie przedstawiono zmodyfikowaną Details metodę.

public ActionResult Details(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Code First ułatwia wyszukiwanie danych przy użyciu Find metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod weryfikuje, 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 linki z http://localhost:xxxx/Movies/Details/1 na coś podobnego http://localhost:xxxx/Movies/Details/12345 (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 ActionResult Delete(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

//
// POST: /Movies/Delete/5

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Należy pamiętać, że Delete metoda nie usuwa danych. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operację tworzenia lub inną operację, która zmienia dane) otwiera dziurę zabezpieczeń. Aby uzyskać więcej informacji na ten temat, zobacz wpis w blogu Stephena Walthera ASP.NET PORADA MVC nr 46 — nie używaj linków usuwania, ponieważ tworzą luki w zabezpieczeniach.

Metoda HttpPost , która usuwa dane, ma nazwę DeleteConfirmed w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa podpisy metody:

// GET: /Movies/Delete/5
public ActionResult Delete(int id = 0)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)

Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążenia metod, aby mieć unikatowy podpis (ta sama nazwa, inna lista parametrów). Jednak w tym miejscu potrzebne są dwie metody Usuwania — jedna dla polecenia GET i jedna dla funkcji POST — które wymagają tego samego podpisu. (Oba muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).

Aby to rozwiązać, 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 w stanie odnaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, co polega na dodaniu atrybutu ActionName("Delete")DeleteConfirmed do metody. To skutecznie wykonuje mapowanie dla systemu routingu, aby adres URL zawierający /Delete/dla żądania POST znalazł metodę DeleteConfirmed .

Innym sposobem uniknięcia problemu z metodami o identycznych nazwach i podpisach jest sztuczna zmiana podpisu metody POST w celu uwzględnienia nieużywanego parametru. Na przykład niektórzy deweloperzy dodają typ FormCollection parametru przekazywany do metody POST, a następnie po prostu nie używają parametru:

public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Zawijanie

Masz teraz pełną ASP.NET aplikację MVC, 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 danych zakodowanych w kodzie. Następnie utworzono i zaprojektowano model danych. Kod platformy Entity Framework Najpierw utworzył bazę danych na podstawie modelu danych na bieżąco, a ASP.NET system szkieletu MVC automatycznie wygenerował metody akcji i widoki podstawowych operacji CRUD. Następnie dodano formularz wyszukiwania, który umożliwia użytkownikom przeszukiwanie bazy danych. Zmieniono bazę danych tak, aby zawierała nową kolumnę danych, a następnie zaktualizowano 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. Zapoznaj się z następującymi linkami wdrażania:

Zachęcam teraz do przejścia do naszego pośredniego poziomu Tworzenie modelu danych platformy Entity Framework dla ASP.NET aplikacji MVC i MVC Music Store samouczków, aby zapoznać się z artykułami ASP.NET w witrynie MSDN i zapoznać się z wieloma filmami wideo i zasobami, https://asp.net/mvc aby dowiedzieć się jeszcze więcej o ASP.NET MVC! Fora ASP.NET MVC to doskonałe miejsce do zadawania pytań.

Owocnej pracy.

— Scott Hanselman (http://hanselman.com i @shanselman na Twitterze) i Rick Anderson blogs.msdn.com/rickAndy