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 ona bezpieczniejsza, znacznie prostsza 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, dopóki nie skompilujesz aplikacji. Wybierz następujące opcje:

  • Nazwa kontrolera: MoviesController. (Jest to wartość domyślna).
  • Szablon: kontroler MVC z akcjami odczytu/zapisu i widokami przy użyciu programu Entity Framework.
  • Klasa modelu: Movie (MvcModel.Models).
  • Klasa kontekstu danych: MovieDBContext (MvcText.Models).
  • Widoki: Razor (CSHTML). (Wartość domyślna).

AddScaffoldedController

Kliknij pozycję Dodaj. Visual Studio Express tworzy następujące pliki i foldery:

  • Plik MoviesController.cs w folderze Controllers 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 ciąg /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 IndexMovies metody akcji kontrolera. Innymi słowy żądanie http://localhost:xxxxx/Movies przeglądarki jest w rzeczywistości takie samo jak żądanie http://localhost:xxxxx/Movies/Indexprzeglądarki . Wynik jest pustą listą filmów, ponieważ jeszcze ich nie dodano.

Zrzut ekranu przedstawiający stronę indeksu filmów języka C języka M.

Tworzenie filmu

Wybierz link Utwórz nowy . Wprowadź szczegóły dotyczące filmu, a następnie kliknij przycisk Utwórz .

Zrzut ekranu przedstawiający stronę Tworzenie filmu W języku C W języku M.

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 na liście będzie widoczny nowo utworzony film.

IndexWhenHarryMet

Utwórz jeszcze kilka wpisów filmu. Wypróbuj linki 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, który kontroler przekazany do widoku przy użyciu Model obiektu, który jest silnie typizowane. Na przykład w szablonie Details.cshtml kod przekazuje każde pole filmu do obiektów DisplayNameFor i DisplayFor HTML Helpers z silnie typizowanego Model obiektu. Metody Create and Edit i view templates również przekazują 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 Visual Studio Express automatycznie dołączyć 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, które kontroler przekazał do widoku przy użyciu obiektu silnie typizowanego Model . Na przykład w szablonie Index.cshtml kod przechodzi 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 wpisany jako Movie. Między innymi oznacza to, że można sprawdzić czas kompilacji kodu i pełną obsługę funkcji IntelliSense w edytorze kodu:

ModelIntelliSense

Praca z bazą danych LocalDB programu SQL Server

Program Entity Framework Code First wykrył, że parametry połączenia bazy danych, które zostały podane, wskazywały Movies na bazę danych, która jeszcze nie istnieje, więc kod Code First automatycznie utworzył bazę danych. Możesz sprawdzić, czy został on utworzony, wyszukując go 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.

Zrzut ekranu przedstawiający okno Eksplorator rozwiązań. Ikona Pokaż wszystkie pliki jest zakreślina na czerwono, a folder Dane aplikacji jest zaznaczony.

Kliknij dwukrotnie plik Movies.mdf , aby otworzyć eksploratora bazy danych, a następnie rozwiń folder Tables , aby wyświetlić tabelę Filmy.

DB_explorer DB_explorer

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\MVCSQL\MVCONTINUUM\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 obniżania poziomu 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.

Zrzut ekranu przedstawiający kartę d b o dot danych o filmach.

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.

Zrzut ekranu przedstawiający okno Eksploratora baz danych. Otwórz definicję tabeli jest zaznaczona w menu po kliknięciu prawym przyciskiem myszy filmów.

Zrzut ekranu przedstawiający kartę d b o dot Movies (Filmy) i Entity Framework Code (Kod platformy Entity Framework) poniżej.

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

Zrzut ekranu przedstawiający okno Eksploratora baz danych. Zamknij połączenie jest zaznaczone w menu kontekstowym Movie D B.

Teraz masz bazę danych i prostą stronę listy do wyświetlania 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.