Objaśnienie modeli, widoków i kontrolerów (VB)

Autor: Stephen Walther

Mylić modele, widoki i kontrolery? W tym samouczku Stephen Walther przedstawia różne części aplikacji ASP.NET MVC.

Ten samouczek zawiera ogólne omówienie modeli, widoków i kontrolerów MVC ASP.NET. Innymi słowy, wyjaśnia M', V i C w ASP.NET MVC.

Po przeczytaniu tego samouczka należy zrozumieć, jak różne części aplikacji ASP.NET MVC współpracują ze sobą. Należy również zrozumieć, jak architektura aplikacji MVC ASP.NET różni się od aplikacji ASP.NET Web Forms lub aplikacji Active Server Pages.

Przykładowa aplikacja ASP.NET MVC

Domyślny szablon programu Visual Studio do tworzenia aplikacji internetowych MVC ASP.NET zawiera niezwykle prostą przykładową aplikację, która może służyć do zrozumienia różnych części aplikacji ASP.NET MVC. Korzystamy z tej prostej aplikacji w tym samouczku.

Utworzysz nową aplikację ASP.NET MVC przy użyciu szablonu MVC, uruchamiając program Visual Studio 2008 i wybierając opcję menu Plik, Nowy projekt (zobacz Rysunek 1). W oknie dialogowym Nowy projekt wybierz swój ulubiony język programowania w obszarze Typy projektów (Visual Basic lub C#) i wybierz pozycję ASP.NET aplikacja internetowa MVC w obszarze Szablony. Kliknij przycisk OK.

Okno dialogowe Nowy projekt

Rysunek 01. Okno dialogowe nowego projektu (kliknij, aby wyświetlić obraz pełnowymiarowy)

Podczas tworzenia nowej aplikacji ASP.NET MVC zostanie wyświetlone okno dialogowe Tworzenie projektu testu jednostkowego (zobacz Rysunek 2). To okno dialogowe umożliwia utworzenie oddzielnego projektu w rozwiązaniu do testowania aplikacji ASP.NET MVC. Wybierz opcję Nie, nie twórz projektu testu jednostkowego i kliknij przycisk OK .

Okno dialogowe Tworzenie testu jednostkowego

Rysunek 02. Okno dialogowe tworzenia testu jednostkowego (kliknij, aby wyświetlić obraz pełnowymiarowy)

Po utworzeniu nowej aplikacji ASP.NET MVC. W oknie Eksplorator rozwiązań zostanie wyświetlonych kilka folderów i plików. W szczególności zobaczysz trzy foldery o nazwie Modele, Widoki i Kontrolery. Jak można odgadnąć z nazw folderów, te foldery zawierają pliki do implementowania modeli, widoków i kontrolerów.

Po rozwinięciu folderu Controllers powinien zostać wyświetlony plik o nazwie AccountController.vb i plik o nazwie HomeController.vb. Po rozwinięciu folderu Views powinny zostać wyświetlone trzy podfoldery o nazwie Konto, Strona główna i Udostępnione. Po rozwinięciu folderu głównego zobaczysz dwa dodatkowe pliki o nazwie About.aspx i Index.aspx (zobacz Rysunek 3). Te pliki tworzą przykładową aplikację dołączona do domyślnego szablonu MVC ASP.NET.

Okno Eksplorator rozwiązań

Rysunek 03. Okno Eksplorator rozwiązań (kliknij, aby wyświetlić obraz pełnowymiarowy)

Przykładową aplikację można uruchomić, wybierając opcję menu Debuguj, Rozpocznij debugowanie. Możesz też nacisnąć klawisz F5.

Po pierwszym uruchomieniu aplikacji ASP.NET zostanie wyświetlone okno dialogowe na rysunku 4, które zaleca włączenie trybu debugowania. Kliknij przycisk OK, a aplikacja zostanie uruchomiona.

Okno dialogowe Debugowanie nie jest włączone

Rysunek 04. Okno dialogowe Debugowanie nie jest włączone (kliknij, aby wyświetlić obraz pełnowymiarowy)

Po uruchomieniu aplikacji ASP.NET MVC program Visual Studio uruchamia aplikację w przeglądarce internetowej. Przykładowa aplikacja składa się tylko z dwóch stron: strony Indeks i strona Informacje. Po pierwszym uruchomieniu aplikacji zostanie wyświetlona strona Indeks (patrz Rysunek 5). Możesz przejść do strony Informacje, klikając link menu w prawym górnym rogu aplikacji.

Strona indeksu

Rysunek 05. Strona indeksu (kliknij, aby wyświetlić obraz pełnowymiarowy)

Zwróć uwagę na adresy URL na pasku adresu przeglądarki. Na przykład po kliknięciu linku menu Informacje adres URL na pasku adresu przeglądarki zmieni się na /Home/About.

Jeśli zamkniesz okno przeglądarki i wrócisz do programu Visual Studio, nie będzie można znaleźć pliku ze ścieżką Strona główna/Informacje. Pliki nie istnieją. Jak to możliwe?

Adres URL nie jest równy stronie

Podczas tworzenia tradycyjnej aplikacji ASP.NET Web Forms lub aplikacji Active Server Pages istnieje korespondencja jeden do jednego między adresem URL a stroną. Jeśli zażądasz strony o nazwie SomePage.aspx z serwera, lepszym rozwiązaniem jest strona na dysku o nazwie SomePage.aspx. Jeśli plik SomePage.aspx nie istnieje, zostanie wyświetlony brzydki błąd 404 — Nie znaleziono strony .

W przypadku kompilowania aplikacji ASP.NET MVC nie istnieje natomiast żadna korespondencja między adresem URL wpisanym na pasku adresu przeglądarki a plikami, które znajdziesz w aplikacji. W aplikacji ASP.NET MVC adres URL odpowiada akcji kontrolera zamiast strony na dysku.

W tradycyjnej aplikacji ASP.NET lub ASP żądania przeglądarki są mapowane na strony. Natomiast w aplikacji ASP.NET MVC żądania przeglądarki są mapowane na akcje kontrolera. Aplikacja ASP.NET Web Forms jest skoncentrowana na zawartości. Natomiast aplikacja ASP.NET MVC jest skoncentrowana na logice aplikacji.

Opis routingu ASP.NET

Żądanie przeglądarki jest mapowane na akcję kontrolera za pomocą funkcji platformy ASP.NET o nazwie ASP.NET Routing. ASP.NET Routing jest używany przez platformę ASP.NET MVC do kierowania żądań przychodzących do akcji kontrolera.

ASP.NET Routing używa tabeli tras do obsługi żądań przychodzących. Ta tabela tras jest tworzona po pierwszym uruchomieniu aplikacji internetowej. Tabela tras jest skonfigurowana w pliku Global.asax. Domyślny plik MVC Global.asax znajduje się w liście 1.

Lista 1 — Global.asax

' Note: For instructions on enabling IIS6 or IIS7 classic mode, 
' visit https://go.microsoft.com/?LinkId=9394802

Public Class MvcApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

        ' MapRoute takes the following parameters, in order:
        ' (1) Route name
        ' (2) URL with parameters
        ' (3) Parameter defaults
        routes.MapRoute( _
            "Default", _
            "{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = ""} _
        )

    End Sub

    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

Po pierwszym uruchomieniu aplikacji ASP.NET wywoływana jest metoda Application_Start(). Na liście 1 ta metoda wywołuje metodę RegisterRoutes(), a metoda RegisterRoutes() tworzy domyślną tabelę tras.

Domyślna tabela tras składa się z jednej trasy. Ta trasa domyślna dzieli wszystkie żądania przychodzące na trzy segmenty (segment adresu URL to wszystko między ukośnikami do przodu). Pierwszy segment jest mapowany na nazwę kontrolera, drugi segment jest mapowany na nazwę akcji, a końcowy segment jest mapowany na parametr przekazany do akcji o nazwie Id.

Rozważmy na przykład następujący adres URL:

/Product/Details/3

Ten adres URL jest analizowany w trzech parametrach w następujący sposób:

Kontroler = produkt

Akcja = szczegóły

Identyfikator = 3

Trasa domyślna zdefiniowana w pliku Global.asax zawiera wartości domyślne dla wszystkich trzech parametrów. Domyślny kontroler to Strona główna, domyślna akcja to Indeks, a domyślny identyfikator jest pustym ciągiem. Mając na uwadze te wartości domyślne, rozważ przeanalizowanie następującego adresu URL:

/Pracownika

Ten adres URL jest analizowany w trzech parametrach w następujący sposób:

Kontroler = Pracownik

Akcja = indeks

Identyfikator =

Na koniec, jeśli otworzysz aplikację ASP.NET MVC bez podania żadnego adresu URL (na przykład http://localhost), adres URL zostanie przeanalizowany w następujący sposób:

Kontroler = Strona główna

Akcja = indeks

Identyfikator =

Żądanie jest kierowane do akcji Index() w klasie HomeController.

Opis kontrolerów

Kontroler jest odpowiedzialny za kontrolowanie sposobu interakcji użytkownika z aplikacją MVC. Kontroler zawiera logikę sterowania przepływem dla ASP.NET aplikacji MVC. Kontroler określa, jaka odpowiedź ma być wysyłana z powrotem do użytkownika, gdy użytkownik wysyła żądanie przeglądarki.

Kontroler jest tylko klasą (na przykład klasą Visual Basic lub C#). Przykładowa aplikacja ASP.NET MVC zawiera kontroler o nazwie HomeController.vb znajdujący się w folderze Controllers. Zawartość pliku HomeController.vb jest odtwarzana na liście 2.

Lista 2 — HomeController.cs

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index()
        ViewData("Title") = "Home Page"
        ViewData("Message") = "Welcome to ASP.NET MVC!"

        Return View()
    End Function

    Function About()
        ViewData("Title") = "About Page"

        Return View()
    End Function
End Class

Zwróć uwagę, że Funkcja HomeController ma dwie metody o nazwie Index() i About(). Te dwie metody odpowiadają dwu akcjom uwidocznionych przez kontroler. Adres URL /Home/Index wywołuje metodę HomeController.Index(), a adres URL /Home/About wywołuje metodę HomeController.About().

Każda publiczna metoda w kontrolerze jest uwidoczniona jako akcja kontrolera. Musisz zachować ostrożność. Oznacza to, że każda publiczna metoda zawarta w kontrolerze może być wywoływana przez każdego, kto ma dostęp do Internetu, wprowadzając właściwy adres URL w przeglądarce.

Omówienie widoków

Dwie akcje kontrolera uwidocznione przez klasę HomeController, Index() i About(), zwracają widok. Widok zawiera znaczniki HTML i zawartość, która jest wysyłana do przeglądarki. Widok jest odpowiednikiem strony podczas pracy z aplikacją ASP.NET MVC.

Musisz utworzyć widoki w odpowiedniej lokalizacji. Akcja HomeController.Index() zwraca widok znajdujący się w następującej ścieżce:

\Views\Home\Index.aspx

Akcja HomeController.About() zwraca widok znajdujący się w następującej ścieżce:

\Views\Home\About.aspx

Ogólnie rzecz biorąc, jeśli chcesz zwrócić widok akcji kontrolera, musisz utworzyć podfolder w folderze Views o takiej samej nazwie jak kontroler. W podfolderze należy utworzyć plik aspx o tej samej nazwie co akcja kontrolera.

Plik w liście 3 zawiera widok About.aspx.

Lista 3 — About.aspx

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>About</h2>
    <p>
        Put content here.
    </p>
</asp:Content>

Jeśli zignoruj pierwszy wiersz w liście 3, większość pozostałej części widoku składa się ze standardowego kodu HTML. Zawartość widoku można zmodyfikować, wprowadzając dowolny kod HTML, który chcesz znaleźć w tym miejscu.

Widok jest bardzo podobny do strony na aktywnych stronach serwera lub ASP.NET Web Forms. Widok może zawierać zawartość i skrypty HTML. Skrypty można napisać w ulubionym języku programowania .NET (na przykład C# lub Visual Basic .NET). Skrypty służą do wyświetlania zawartości dynamicznej, takiej jak dane bazy danych.

Opis modeli

Omówiliśmy kontrolery i omówiliśmy poglądy. Ostatnim tematem, który musimy omówić, jest model. Co to jest model MVC?

Model MVC zawiera całą logikę aplikacji, która nie jest zawarta w widoku lub kontrolerze. Model powinien zawierać całą logikę biznesową aplikacji, logikę walidacji i logikę dostępu do bazy danych. Jeśli na przykład używasz programu Microsoft Entity Framework do uzyskiwania dostępu do bazy danych, w folderze Models utworzysz klasy programu Entity Framework (plik edmx).

Widok powinien zawierać tylko logikę związaną z generowaniem interfejsu użytkownika. Kontroler powinien zawierać tylko minimalną logikę wymaganą do zwrócenia odpowiedniego widoku lub przekierowania użytkownika do innej akcji (kontrolki przepływu). Wszystkie inne elementy powinny być zawarte w modelu.

Ogólnie rzecz biorąc, należy dążyć do modeli tłuszczu i chudych kontrolerów. Metody kontrolera powinny zawierać tylko kilka wierszy kodu. Jeśli akcja kontrolera jest zbyt gruba, należy rozważyć przeniesienie logiki do nowej klasy w folderze Models.

Podsumowanie

Ten samouczek zawiera ogólne omówienie różnych części aplikacji internetowej ASP.NET MVC. Przedstawiono sposób ASP.NET Routing mapuje przychodzące żądania przeglądarki na określone akcje kontrolera. Wiesz już, jak kontrolery organizują sposób zwracania widoków do przeglądarki. Na koniec pokazano, jak modele zawierają logikę dostępu do aplikacji, weryfikacji i dostępu do bazy danych.