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
.
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.
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
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla