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 ona bezpieczniejsza, znacznie prostsza 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 zbadaj metodę Details .

Zrzut ekranu przedstawiający kartę Kontroler filmów dot c s. Szczegóły są wybierane 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 .

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 podejmie próbę wykonania z nim niczego. 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 podobny http://localhost:xxxx/Movies/Details/12345 do (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.

Zapoznaj się z metodami Delete 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ń. Aby uzyskać więcej informacji na ten temat, zobacz wpis w blogu Stephena Walthera ASP.NET PORADA MVC #46 — Nie używaj linków usuwania, ponieważ tworzą one luki w zabezpieczeniach.

Metoda HttpPost , która usuwa dane, nosi nazwę DeleteConfirmed , aby nadać metodzie HTTP POST unikatowy podpis lub nazwę. 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 (tę samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie metody Usuwania — jedna dla metody GET i druga dla żądania POST — które mają ten sam podpis parametru. (Obie 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. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak wprowadza to niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing normalnie nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co zobaczysz w przykładzie, czyli dodanie atrybutu ActionName("Delete")DeleteConfirmed do metody . W ten sposób wykonywane jest 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 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 W języku C języka M.

Następne kroki

Po utworzeniu i przetestowaniu aplikacji internetowej następnym krokiem jest udostępnienie jej innym osobom do użycia przez Internet. 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 próbnym platformy Windows Azure. Zalecamy wykonanie następnego samouczka Wdrażanie aplikacji Secure ASP.NET MVC z członkostwem, uwierzytelnianiem OAuth i 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 świetne 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