Badanie metod Details i Delete

Autor Rick Anderson

Note

Zaktualizowana wersja tego samouczka jest dostępna w tym miejscu , w którym są używane ASP.NET MVC 5 i Visual Studio 2013. Jest to bezpieczniejsze i łatwiejsze w obserwowanie i zademonstrowanie większej liczby funkcji.

W tej części samouczka sprawdzisz automatycznie wygenerowany Details i Delete metod.

Badanie metod Details i Delete

Otwórz kontroler Movie i Przeanalizuj metodę Details.

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 szkieletu MVC, który utworzył tę metodę akcji, dodaje komentarz zawierający żądanie HTTP, które wywołuje metodę. W tym przypadku jest to żądanie GET z trzema segmentami adresów URL, kontrolerem Movies, metodą Details i ID wartością.

Code First ułatwia wyszukiwanie danych przy użyciu metody Find. Ważna funkcja zabezpieczeń wbudowana w metodę polega na tym, że kod sprawdza, czy metoda Find odnalazła film, zanim kod próbuje wykonać dowolne czynności. Na przykład haker może wprowadzić błędy do witryny przez zmianę adresu URL utworzonego przez linki z http://localhost:xxxx/Movies/Details/1 na element podobny do http://localhost:xxxx/Movies/Details/12345 (lub innej wartości, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzono filmu o wartości null, film o wartości null spowoduje błąd bazy danych.

Przeanalizuj metody 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 metoda HTTP Get``Delete 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 jakiejkolwiek innej operacji, która zmienia dane) powoduje otwarcie otworu zabezpieczeń. Aby uzyskać więcej informacji na ten temat, zobacz wpis w blogu Stephen Walther ASP.NET MVC Tip #46 — nie używaj linków usuwania, ponieważ tworzą one luki w zabezpieczeniach.

Metoda HttpPost, która usuwa dane, ma nazwę DeleteConfirmed, aby nadać metodzie POST protokołu HTTP unikatowy podpis lub nazwę. Poniżej przedstawiono dwie sygnatury metod:

// 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, aby przeciążone metody miały unikatowy podpis parametru (taka sama nazwa metody, ale inna lista parametrów). Jednak w tym miejscu wymagane są dwie metody usuwania — jeden dla elementu GET i jeden dla elementu POST--oba mają taki sam podpis parametru. (Oba muszą akceptować jedną liczbę całkowitą jako parametr).

Aby to zrobić, możesz wykonać kilka czynności. Jedną z nich jest nadanie metodom różnych nazw. To właśnie mechanizm tworzenia szkieletu w poprzednim przykładzie. Wprowadzamy jednak 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. To rozwiązanie jest widoczne w przykładzie, czyli dodanie atrybutu ActionName("Delete") do metody DeleteConfirmed. Efektywnie wykonuje to mapowanie dla systemu routingu, aby adres URL, który zawiera /delete/dla żądania post, znalazł metodę DeleteConfirmed.

Innym typowym sposobem, aby uniknąć problemu z metodami, które mają identyczne nazwy i podpisy, jest sztuczna zmiana sygnatury metody POST w celu uwzględnienia nieużywanego parametru. Na przykład niektórzy deweloperzy dodają typ parametru FormCollection, który jest przesyłany do metody POST, a następnie po prostu nie należy używać 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ę ASP.NET MVC, która przechowuje dane w lokalnej bazie danych. Możesz tworzyć, odczytywać, aktualizować, usuwać i wyszukiwać filmy.

Następne kroki

Po skompilowaniu i przetestowaniu aplikacji sieci Web następnym krokiem jest udostępnienie go innym osobom, które będą mogły korzystać z Internetu. W tym celu należy wdrożyć go w dostawcy hostingu w sieci Web. Firma Microsoft oferuje bezpłatny hosting w sieci Web dla maksymalnie 10 witryn sieci Web w ramach bezpłatnego konta wersji próbnej platformy Microsoft Azure. Sugeruję, aby dalej postępować zgodnie z moim samouczkiem Wdróż aplikację Secure ASP.NET MVC z członkostwem, uwierzytelnianiem OAuth i SQL Database w witrynie sieci Web systemu Windows Azure. Doskonały samouczek to element pośredni Dykstra , który tworzy model danych Entity Framework dla aplikacji ASP.NET MVC. StackOverflow i ASP.NET MVC są doskonałym miejscem do zadawania pytań. Obserwuj mnie w serwisie Twitter, aby otrzymywać aktualizacje dotyczące moich najnowszych samouczków.

Opinia jest powitania.

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