Uzyskiwanie dostępu do danych modelu z nowego kontrolera

Autor : Rick Anderson

Uwaga / Notatka

Zaktualizowana wersja tego samouczka jest dostępna tutaj przy użyciu najnowszej wersji programu Visual Studio. W nowym samouczku jest używany ASP.NET Core MVC, który oferuje wiele ulepszeń w porównaniu do tego samouczka.

W tym samouczku przedstawiono ASP.NET Core MVC z kontrolerami i widokami. Razor Pages to nowa alternatywa w ASP.NET Core, model programowania oparty na stronach, który ułatwia tworzenie internetowego interfejsu użytkownika, czyniąc je łatwiejszym i bardziej wydajnym. Zalecamy wypróbowanie samouczka razor Pages przed wersją MVC. Samouczek Razor Pages

  • Jest łatwiejsze do naśladowania.
  • Obejmuje więcej funkcji.
  • Jest preferowanym podejściem do tworzenia nowych aplikacji.

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. Jeśli nie skompilujesz aplikacji, wystąpi błąd podczas dodawania kontrolera.

W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy folder Kontrolery , a następnie kliknij przycisk Dodaj, a następnie kontroler.

Zrzut ekranu przedstawiający okno Eksploratora rozwiązań. Menu kontekstowe po kliknięciu prawym przyciskiem myszy w folderze Kontrolery jest otwarte i wybrano polecenie Dodaj. Kontroler jest wybrany w menu podrzędnym.

W oknie dialogowym Dodawanie szkieletu kliknij pozycję Kontroler MVC 5 z widokami, przy użyciu programu Entity Framework, a następnie kliknij przycisk Dodaj.

Zrzut ekranu przedstawiający okno dialogowe Dodawanie szablonu. Wybrano kontroler M V C 5 z widokami, używający Entity Framework.

  • Wybierz Movie (MvcMovie.Models) dla klasy Model.

  • Wybierz MovieDBContext (MvcMovie.Models) jako klasę kontekstu danych.

  • W polu Nazwa kontrolera wprowadź MoviesController.

    Na poniższej ilustracji przedstawiono ukończone okno dialogowe.

Zrzut ekranu przedstawiający okno dialogowe Dodawanie kontrolera z wpisanymi danymi klasy i nazwy.

Kliknij przycisk Dodaj. (Jeśli wystąpi błąd, prawdopodobnie nie skompilujesz aplikacji przed rozpoczęciem dodawania kontrolera). Program Visual Studio tworzy następujące pliki i foldery:

  • Plik MoviesController.cs w folderze Controllers.
  • Folder Views\Movies.
  • Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml i Index.cshtml w nowym folderze Views\Movies.

Program Visual Studio automatycznie utworzył metody akcji CRUD (tworzenie, odczytywanie, aktualizowanie i usuwanie) oraz widoki (automatyczne tworzenie metod akcji CRUD i widoków jest nazywane szkieletowaniem). Masz teraz w pełni funkcjonalną aplikację internetową, która umożliwia tworzenie, wyświetlanie, edytowanie i usuwanie wpisów o filmach.

Uruchom aplikację i kliknij link MVC Movie (lub przejdź do Movies kontrolera, dołączając /Movies do adresu URL na pasku adresu przeglądarki). Ponieważ aplikacja opiera się na routingu domyślnym (zdefiniowanym w pliku App_Start\RouteConfig.cs ), żą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ż nie dodano jeszcze żadnych filmów.

Zrzut ekranu przedstawiający stronę filmową MVC z pustą listą Indeks.

Tworzenie filmu

Wybierz link Utwórz nowy. Wprowadź szczegółowe informacje o filmie, a następnie kliknij przycisk Utwórz .

Zrzut ekranu przedstawiający stronę Tworzenie filmu.

Uwaga / Notatka

W polu Cena może nie być możliwe wprowadzenie punktów dziesiętnych lub przecinków. Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż angielski, które używają przecinka (",") dla punktu dziesiętnego oraz formatów dat innych niż US-English, należy uwzględnić globalize.js i określony plik kultury/globalize.cultures.js (z https://github.com/jquery/globalize) oraz JavaScript do użycia Globalize.parseFloat. Pokażę, jak to zrobić w następnym samouczku. Na razie wprowadź tylko liczby całkowite, takie jak 10.

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.

Zrzut ekranu przedstawiający stronę Indeks z dodanym nowym filmem.

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 metodą Index.

public class MoviesController : Controller
{
    private MovieDBContext db = new MovieDBContext();

    // GET: /Movies/
    public ActionResult Index()
    {
        return View(db.Movies.ToList());
    }

Żądanie do Movies kontrolera zwraca wszystkie wpisy w Movies tabeli, a następnie przekazuje wyniki do Index widoku. Poniższa linijka z klasy MoviesController tworzy wystąpienie kontekstu bazy danych filmu, jak opisano wcześniej. Kontekst bazy danych filmów umożliwia wykonywanie zapytań, edytowanie i usuwanie filmów.

private MovieDBContext db = new MovieDBContext();

Silnie typizowane modele i słowo kluczowe @model

Wcześniej w tym samouczku pokazano, jak kontroler może przekazywać dane lub obiekty do szablonu widoku za pomocą obiektu ViewBag. Jest ViewBag to obiekt dynamiczny, który zapewnia wygodny, opóźniony sposób przekazywania informacji do widoku.

MvC zapewnia również możliwość przekazywania silnie typiowanych 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 szkieletowania w Visual Studio używał tego podejścia (czyli przekazywania silnie typizowanego modelu) z klasami i szablonami widoków podczas tworzenia metod i widoków.

W pliku Controllers\MoviesController.cs sprawdź wygenerowaną Details metodę. Metoda Details została przedstawiona poniżej.

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);
}

Parametr id jest zwykle przekazywany jako dane trasy, na przykład http://localhost:1234/movies/details/1 spowoduje ustawienie kontrolera na kontroler filmów, akcję na details, a id na 1. Możesz również przekazać identyfikator przy pomocy parametru zapytania w następujący sposób:

http://localhost:1234/movies/details?id=1

Jeśli element Movie zostanie znaleziony, wystąpienie Movie modelu zostanie przekazane do Details widoku:

return View(movie);

Sprawdź zawartość pliku Views\Movies\Details.cshtml :

@model MvcMovie.Models.Movie

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>Movie</h4>
<hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>
         @*Markup omitted for clarity.*@        
    </dl>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

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, przy użyciu silnie typizowanego obiektu Model, dostęp do filmu, który kontroler przekazał do widoku. Na przykład w szablonie Details.cshtml kod przekazuje każde pole filmu do HTML pomocnika DisplayNameForDisplayFor z silnie typizowanym obiektem Model. Metody Create i Edit oraz szablony wyświetlania również przekazują obiekt modelu filmu.

Sprawdź szablon widoku Index.cshtml i metodę Index w pliku MoviesController.cs . Zwróć uwagę, że kod tworzy List obiekt, gdy wywołuje pomocniczą metodę View w metodzie akcji Index. Następnie kod przekazuje tę Movies listę z Index metody akcji do widoku:

public ActionResult Index()
{
    return View(db.Movies.ToList());
}

Po utworzeniu kontrolera filmu program Visual Studio 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 przy użyciu silnie typizowanego Model obiektu dostęp do listy filmów, które kontroler przekazuje do widoku. Na przykład w szablonie Index.cshtml kod przechodzi przez filmy, wykonując instrukcję foreach na silnie typizowanym obiekcie Model.

@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", new { id=item.ID })  |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID }) 
        </td>
    </tr>
}

Ponieważ obiekt Model jest silnie typowany jako obiekt IEnumerable<Movie>, każdy obiekt item w pętli jest typu Movie. Między innymi oznacza to, że uzyskujesz kontrolę czasu 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 parametr połączenia z bazą danych, który został podany, wskazywał na Movies bazę danych, której jeszcze nie ma, więc 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 .

Zrzut ekranu przedstawiający okno Eksplorator rozwiązań. Folder Dane aplikacji i podfolder Filmy dot m d f są zakreśline na czerwono.

Kliknij dwukrotnie Movies.mdf , aby otworzyć EKSPLORATORA SERWERA, a następnie rozwiń folder Tables , aby wyświetlić tabelę Filmy. Zwróć uwagę na ikonę klucza obok identyfikatora. Domyślnie program EF utworzy właściwość o nazwie ID klucza podstawowego. Aby uzyskać więcej informacji na temat EF i MVC, zobacz doskonały samouczek Toma Dykstry dotyczący MVC i EF.

DB_explorer

Kliknij prawym przyciskiem myszy tabelę Movies i wybierz polecenie Pokaż dane tabeli, aby wyświetlić utworzone dane.

Zrzut ekranu przedstawiający okno Eksplorator serwera. Menu filmów po kliknięciu prawym przyciskiem myszy jest otwarte. Pokaż dane tabeli jest zaznaczone i zakreśline na czerwono.

Zrzut ekranu przedstawiający okno M V C Movie Microsoft Visual Studio. Wybrano kartę d b o dot Movies Data.

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 serwera. Menu kontekstowe dla pozycji

Zrzut ekranu przedstawiający okno M V C Movie w programie Microsoft Visual Studio. Wybrano kartę d b o dot Movies Design, czyli Projektowanie filmów.

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 Eksplorator serwera. Menu kontekstowe Movie D B jest otwarte po kliknięciu prawym przyciskiem myszy. Zamknij połączenie jest zaznaczone i zakreśline na czerwono.

Masz teraz bazę danych i strony do wyświetlania, edytowania, aktualizowania i usuwania danych. W następnym samouczku przeanalizujemy resztę kodu szkieletowego i dodamy metodę SearchIndex oraz widok SearchIndex, który umożliwia wyszukiwanie filmów w tej bazie danych. Aby uzyskać więcej informacji na temat korzystania z platformy Entity Framework z mvC, zobacz Tworzenie modelu danych programu Entity Framework dla aplikacji MVC ASP.NET.