Uzyskiwanie dostępu do danych modelu z kontrolera przy użyciu szablonu widoku
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 sekcji utworzysz nową MoviesController
klasę i napiszesz kod, który pobiera dane filmu i wyświetla je w przeglądarce przy użyciu szablonu widoku.
Skompiluj aplikację przed przejściem do następnego kroku.
Kliknij prawym przyciskiem myszy folder Controllers i utwórz nowy MoviesController
kontroler. Poniższe opcje nie będą wyświetlane do momentu skompiluj aplikację. Wybierz jedną z następujących opcji:
- Nazwa kontrolera: MoviesController. (Jest to wartość domyślna).
- Szablon: Kontroler MVC z akcjami i widokami odczytu/zapisu przy użyciu platformy Entity Framework.
- Klasa modelu: Movie (MvcFilm.Models).
- Klasa kontekstu danych: MovieDBContext (MvcFilm.Models).
- Widoki: Razor (CSHTML). (Wartość domyślna).
Kliknij przycisk Dodaj. Program Visual Studio Express tworzy następujące pliki i foldery:
- Plik MoviesController.cs w folderze Kontrolery projektu.
- Folder Filmy w folderze Widoki projektu.
- Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml i Index.cshtml w nowym folderze Views\Movies.
ASP.NET MVC 4 automatycznie utworzył metody akcji CRUD (tworzenie, odczytywanie, aktualizowanie i usuwanie) oraz widoki (automatyczne tworzenie metod i widoków akcji CRUD jest nazywane tworzeniem szkieletów). Masz teraz w pełni funkcjonalną aplikację internetową, która umożliwia tworzenie, wyświetlanie listy, edytowanie i usuwanie wpisów filmu.
Uruchom aplikację i przejdź do Movies
kontrolera, dołączając /Movies do adresu URL na pasku adresu przeglądarki. Ponieważ aplikacja korzysta z domyślnego routingu (zdefiniowanego w pliku Global.asax ), żądanie http://localhost:xxxxx/Movies
przeglądarki jest kierowane do domyślnej Index
metody Movies
akcji kontrolera. Innymi słowy żądanie http://localhost:xxxxx/Movies
przeglądarki jest w rzeczywistości takie samo jak żądanie http://localhost:xxxxx/Movies/Index
przeglądarki . Wynik jest pustą listą filmów, ponieważ nie dodano jeszcze żadnych filmów.
Tworzenie filmu
Wybierz link Utwórz nowy. Wprowadź szczegółowe informacje o filmie, a następnie kliknij przycisk Utwórz .
Kliknięcie przycisku Utwórz powoduje opublikowanie formularza na serwerze, na którym informacje o filmie są zapisywane w bazie danych. Następnie nastąpi przekierowanie do adresu URL /Movies , w którym możesz zobaczyć nowo utworzony film na liście.
Utwórz jeszcze kilka wpisów filmowych. Spróbuj użyć linków Edytuj, Szczegóły i Usuń , które są funkcjonalne.
Badanie wygenerowanego kodu
Otwórz plik Controllers\MoviesController.cs i sprawdź wygenerowaną Index
metodę. Poniżej przedstawiono część kontrolera filmu z Index
metodą .
public class MoviesController : Controller
{
private MovieDBContext db = new MovieDBContext();
//
// GET: /Movies/
public ActionResult Index()
{
return View(db.Movies.ToList());
}
Poniższy wiersz z MoviesController
klasy tworzy wystąpienie kontekstu bazy danych filmu zgodnie z wcześniejszym opisem. Kontekst bazy danych filmów umożliwia wykonywanie zapytań, edytowanie i usuwanie filmów.
private MovieDBContext db = new MovieDBContext();
Żądanie do Movies
kontrolera zwraca wszystkie wpisy w Movies
tabeli bazy danych filmów, a następnie przekazuje wyniki do Index
widoku.
Silnie typizowane modele i @model słowo kluczowe
Wcześniej w tym samouczku pokazano, jak kontroler może przekazywać dane lub obiekty do szablonu widoku przy użyciu ViewBag
obiektu . Jest ViewBag
to obiekt dynamiczny, który zapewnia wygodny, opóźniony sposób przekazywania informacji do widoku.
ASP.NET MVC zapewnia również możliwość przekazywania silnie typiowanych danych lub obiektów do szablonu widoku. To silnie typizowane podejście umożliwia lepsze sprawdzanie czasu kompilacji kodu i bogatszą funkcję IntelliSense w edytorze programu Visual Studio. Mechanizm tworzenia szkieletów w programie Visual Studio używał tego podejścia z szablonami MoviesController
klas i widoków podczas tworzenia metod i widoków.
W pliku Controllers\MoviesController.cs sprawdź wygenerowaną Details
metodę. Poniżej przedstawiono część kontrolera filmu z Details
metodą .
public ActionResult Details(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
Jeśli element Movie
zostanie znaleziony, wystąpienie Movie
modelu zostanie przekazane do widoku Szczegóły. Sprawdź zawartość pliku Views\Movies\Details.cshtml .
Dołączając instrukcję @model
w górnej części pliku szablonu widoku, można określić typ obiektu, którego oczekuje widok. Po utworzeniu kontrolera filmu program Visual Studio automatycznie uwzględnił następującą @model
instrukcję w górnej części pliku Details.cshtml :
@model MvcMovie.Models.Movie
Ta @model
dyrektywa umożliwia dostęp do filmu przekazanego przez kontroler do widoku przy użyciu silnie typizowanego Model
obiektu. Na przykład w szablonie Details.cshtml kod przekazuje każde pole filmu do pomocników DisplayNameFor
HTML DisplayFor z silnie typizowanego Model
obiektu. Metody Tworzenia i edytowania oraz wyświetlanie szablonów przekazują również obiekt modelu filmu.
Sprawdź szablon widoku Index.cshtml i metodę Index
w pliku MoviesController.cs. Zwróć uwagę, że kod tworzy obiekt, gdy wywołuje View
metodę List
pomocnika w metodzie Index
akcji. Następnie kod przekazuje tę Movies
listę z kontrolera do widoku:
public ActionResult Index()
{
return View(db.Movies.ToList());
}
Po utworzeniu kontrolera filmu program Visual Studio Express automatycznie uwzględnił następującą @model
instrukcję w górnej części pliku Index.cshtml :
@model IEnumerable<MvcMovie.Models.Movie>
Ta @model
dyrektywa umożliwia dostęp do listy filmów przekazywanych przez kontroler do widoku przy użyciu silnie typizowanego Model
obiektu. Na przykład w szablonie Index.cshtml kod wykonuje pętle kodu przez filmy, wykonując instrukcję foreach
dla silnie typizowanego Model
obiektu:
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<th>
@Html.DisplayFor(modelItem => item.Rating)
</th>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", { id=item.ID })
</td>
</tr>
}
Model
Ponieważ obiekt jest silnie typowany (jako IEnumerable<Movie>
obiekt), każdy item
obiekt w pętli jest typowany jako Movie
. Między innymi oznacza to, że uzyskujesz kontrolę czasu kompilacji kodu i pełną obsługę funkcji IntelliSense w edytorze kodu:
Praca z bazą danych LocalDB programu SQL Server
Program Entity Framework Code First wykrył, że baza danych parametry połączenia, która została podana, wskazywała Movies
na bazę danych, która jeszcze nie istnieje, więc program Code First automatycznie utworzył bazę danych. Możesz sprawdzić, czy został on utworzony, patrząc w folderze App_Data . Jeśli nie widzisz pliku Movies.mdf, kliknij przycisk Pokaż wszystkie pliki na pasku narzędzi Eksplorator rozwiązań, kliknij przycisk Odśwież, a następnie rozwiń folder App_Data.
Kliknij dwukrotnie Movies.mdf , aby otworzyć eksploratora bazy danych, a następnie rozwiń folder Tables , aby wyświetlić tabelę Filmy.
Uwaga
Jeśli eksplorator bazy danych nie jest wyświetlany, w menu NARZĘDZIA wybierz pozycję Połącz z bazą danych, a następnie anuluj okno dialogowe Wybieranie źródła danych. Spowoduje to wymuszenie otwarcia eksploratora bazy danych.
Uwaga
Jeśli używasz usługi VWD lub Visual Studio 2010 i występuje błąd podobny do dowolnego z następujących:
- Baza danych "C:\Webs\MVC4\MVCFILM\MVCFILM\APP_DATA\MOVIES. Nie można otworzyć usługi MDF, ponieważ jest w wersji 706. Ten serwer obsługuje wersję 655 lub starszą. Ścieżka na starszą dół nie jest obsługiwana.
- "Wyjątek InvalidOperation był nieobsługiwany przez kod użytkownika" Podany program SqlConnection nie określa katalogu początkowego.
Należy zainstalować narzędzia SQL Server Data Tools i localDB. MovieDBContext
Sprawdź parametry połączenia określone na poprzedniej stronie.
Kliknij prawym przyciskiem myszy tabelę Movies
i wybierz polecenie Pokaż dane tabeli, aby wyświetlić utworzone dane.
Kliknij prawym przyciskiem myszy tabelę Movies
i wybierz polecenie Otwórz definicję tabeli, aby wyświetlić strukturę tabeli utworzoną przez program Entity Framework Code First.
Zwróć uwagę na sposób mapowania schematu Movies
tabeli na utworzoną wcześniej klasę Movie
. Program Entity Framework Code First automatycznie utworzył ten schemat na podstawie klasy Movie
.
Po zakończeniu zamknij połączenie, klikając prawym przyciskiem myszy pozycję MovieDBContext i wybierając pozycję Zamknij połączenie. (Jeśli nie zamkniesz połączenia, może zostać wyświetlony błąd przy następnym uruchomieniu projektu).
Teraz masz bazę danych i prostą stronę listy do wyświetlania z niej zawartości. W następnym samouczku przeanalizujemy resztę kodu szkieletowego i dodamy metodę SearchIndex
i SearchIndex
widok, który umożliwia wyszukiwanie filmów w tej bazie danych.