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
.
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.
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