Ulepszanie metod Details i Delete (C#)
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 łatwiejsza do naśladowania i demonstruje więcej funkcji.
W tym samouczku przedstawiono podstawy tworzenia aplikacji internetowej ASP.NET MVC przy użyciu programu Microsoft Visual Web Developer 2010 Express Service Pack 1, który jest bezpłatną wersją programu Microsoft Visual Studio. Przed rozpoczęciem upewnij się, że zostały zainstalowane wymagania wstępne wymienione poniżej. Wszystkie z nich można zainstalować, klikając następujący link: Instalator platformy internetowej. Alternatywnie można indywidualnie zainstalować wymagania wstępne, korzystając z następujących linków:
- Wymagania wstępne programu Visual Studio Web Developer Express SP1
- aktualizacja narzędzi ASP.NET MVC 3
- SQL Server Compact 4.0 (obsługa środowiska uruchomieniowego i narzędzi)
Jeśli używasz programu Visual Studio 2010 zamiast Visual Web Developer 2010, zainstaluj wymagania wstępne, klikając następujący link: Wymagania wstępne programu Visual Studio 2010.
Projekt Visual Web Developer z kodem źródłowym języka C# jest dostępny do dołączenia do tego tematu. Pobierz wersję języka C#. Jeśli wolisz program Visual Basic, przejdź do wersji Visual Basic tego samouczka.
W tej części samouczka wprowadzisz pewne ulepszenia automatycznie wygenerowane Details
i Delete
metody. Te zmiany nie są wymagane, ale za pomocą zaledwie kilku małych fragmentów kodu można łatwo ulepszyć aplikację.
Ulepszanie metod szczegółów i usuwania
Po utworzeniu szkieletu Movie
kontrolera ASP.NET wygenerowany kod MVC, który działał świetnie, ale może to być bardziej niezawodne dzięki zaledwie kilku małym zmianom.
Otwórz kontroler i zmodyfikuj Details
metodęMovie
, zwracającHttpNotFound
, gdy film nie zostanie znaleziony. Należy również zmodyfikować Details
metodę, aby ustawić wartość domyślną identyfikatora przekazanego do niej. (Wprowadzono podobne zmiany w metodzie Edit
w części 6 tego samouczka). Należy jednak zmienić typ zwracanej Details
metody z ViewResult
na ActionResult
, ponieważ HttpNotFound
metoda nie zwraca ViewResult
obiektu. W poniższym przykładzie przedstawiono zmodyfikowaną Details
metodę.
public ActionResult Details(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
Code First ułatwia wyszukiwanie danych przy użyciu Find
metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod weryfikuje, czy Find
metoda znalazła film, zanim kod spróbuje wykonać z nim wszystko. 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 coś podobnego http://localhost:xxxx/Movies/Details/12345
(lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, może to spowodować błąd bazy danych.
Podobnie zmień Delete
metody i DeleteConfirmed
, aby określić wartość domyślną parametru ID i zwrócić HttpNotFound
, gdy film nie zostanie znaleziony. Zaktualizowane Delete
metody w kontrolerze Movie
są pokazane poniżej.
// GET: /Movies/Delete/5
public ActionResult Delete(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
Należy pamiętać, że Delete
metoda nie usuwa danych. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operację tworzenia lub inną operację, 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 nr 46 — nie używaj linków usuwania, ponieważ tworzą luki w zabezpieczeniach.
Metoda HttpPost
, która usuwa dane, ma nazwę 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 = 0)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążenia metod, aby mieć unikatowy podpis (ta sama nazwa, inna lista parametrów). Jednak w tym miejscu potrzebne są dwie metody Usuwania — jedna dla polecenia GET i jedna dla funkcji POST — które wymagają tego samego podpisu. (Oba 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. To właśnie zrobiliśmy 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 w stanie odnaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, co polega na dodaniu atrybutu ActionName("Delete")
DeleteConfirmed
do metody. To skutecznie wykonuje mapowanie dla systemu routingu, aby adres URL zawierający /Delete/dla żądania POST znalazł metodę DeleteConfirmed
.
Innym sposobem uniknięcia problemu z metodami o identycznych nazwach i podpisach 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");
}
Zawijanie
Masz teraz pełną ASP.NET aplikację MVC, która przechowuje dane w bazie danych SQL Server Compact. Możesz tworzyć, odczytywać, aktualizować, usuwać i wyszukiwać filmy.
W tym podstawowym samouczku rozpoczęto tworzenie kontrolerów, kojarzenie ich z widokami i przekazywanie danych zakodowanych w kodzie. Następnie utworzono i zaprojektowano model danych. Kod platformy Entity Framework Najpierw utworzył bazę danych na podstawie modelu danych na bieżąco, a ASP.NET system szkieletu MVC automatycznie wygenerował metody akcji i widoki podstawowych operacji CRUD. Następnie dodano formularz wyszukiwania, który umożliwia użytkownikom przeszukiwanie bazy danych. Zmieniono bazę danych tak, aby zawierała nową kolumnę danych, a następnie zaktualizowano dwie strony, aby utworzyć i wyświetlić te nowe dane. Dodano walidację, oznaczając model danych atrybutami z DataAnnotations
przestrzeni nazw. Wynikowa walidacja jest uruchamiana na kliencie i na serwerze.
Jeśli chcesz wdrożyć aplikację, warto najpierw przetestować aplikację na lokalnym serwerze usług IIS 7. Możesz użyć tego linku Instalatora platformy sieci Web , aby włączyć ustawienie usług IIS dla aplikacji ASP.NET. Zapoznaj się z następującymi linkami wdrażania:
- mapa zawartości wdrożenia ASP.NET
- Włączanie usług IIS 7.x
- Wdrażanie projektów aplikacji internetowych
Zachęcam teraz do przejścia do naszego pośredniego poziomu Tworzenie modelu danych platformy Entity Framework dla ASP.NET aplikacji MVC i MVC Music Store samouczków, aby zapoznać się z artykułami ASP.NET w witrynie MSDN i zapoznać się z wieloma filmami wideo i zasobami, https://asp.net/mvc aby dowiedzieć się jeszcze więcej o ASP.NET MVC! Fora ASP.NET MVC to doskonałe miejsce do zadawania pytań.
Owocnej pracy.
— Scott Hanselman (http://hanselman.com i @shanselman na Twitterze) i Rick Anderson blogs.msdn.com/rickAndy
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