Udostępnij za pośrednictwem


Badanie metod akcji Szczegóły i Usuwanie

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 bezpieczniejszy, znacznie prostszy do naśladowania i demonstruje więcej funkcji.

W tej części samouczka zapoznasz się z automatycznie wygenerowanymi Details metodami i Delete .

Badanie metod Details i Delete

Movie Otwórz kontroler i sprawdź metodę Details .

Zrzut ekranu przedstawiający kartę Kontroler filmów dot c s. Szczegóły są zaznaczone w menu rozwijanym po prawej stronie.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Aparat tworzenia szkieletów MVC, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest GET to żądanie z trzema segmentami adresów URL, Movies kontrolerem, Details metodą i wartością ID .

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ć coś z nim. 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, film o wartości null spowoduje błąd bazy danych.

Zbadaj Delete metody i DeleteConfirmed .

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    Movie movie = db.Movies.Find(id);
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Należy pamiętać, że HTTP Get``Delete metoda nie usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. 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:

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

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

Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie metody Usuwania — jedna dla metody GET i druga dla funkcji POST — które mają ten sam podpis parametru. (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. Tak właśnie zrobił mechanizm tworzenia szkieletów 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 typowym 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 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");
}

Podsumowanie

Masz teraz kompletną aplikację MVC ASP.NET, która przechowuje dane w lokalnej bazie danych. Możesz tworzyć, odczytywać, aktualizować, usuwać i wyszukiwać filmy.

Zrzut ekranu przedstawiający stronę indeksu wyszukiwania filmów języka M V C.

Następne kroki

Po utworzeniu i przetestowaniu aplikacji internetowej następnym krokiem jest udostępnienie jej innym osobom do korzystania z Internetu. W tym celu należy wdrożyć go u dostawcy hostingu internetowego. Firma Microsoft oferuje bezpłatny hosting internetowy dla maksymalnie 10 witryn internetowych na bezpłatnym koncie wersji próbnej platformy Windows Azure. Sugeruję, że następnie wykonasz czynności opisane w moim samouczku Wdrażanie aplikacji Secure ASP.NET MVC z członkostwem, OAuth i usługą SQL Database w witrynie internetowej platformy Windows Azure. Doskonałym samouczkiem jest pośredni poziom tworzenia modelu danych platformy Entity Framework dla ASP.NET aplikacji MVC firmy Tom Dykstra. Stackoverflow i fora ASP.NET MVC to doskonałe miejsca do zadawania pytań. Śledź mnie na twitterze, aby uzyskać aktualizacje na temat moich najnowszych samouczków.

Opinia jest mile widziana.

Rick Anderson twitter: @RickAndMSFT
Scott Hanselman twitter: @shanselman