Omówienie platformy ASP.NET Core MVC

Autor: Steve Smith

ASP.NET Core MVC to bogata struktura do tworzenia aplikacji internetowych i interfejsów API przy użyciu wzorca projektowego Model-View-Controller.

Wzorzec MVC

Wzorzec architektury Model-View-Controller (MVC) oddziela aplikację na trzy główne grupy składników: Modele, widoki i kontrolery. Ten wzorzec pomaga osiągnąć separację problemów. Korzystając z tego wzorca, żądania użytkowników są kierowane do kontrolera, który jest odpowiedzialny za pracę z modelem w celu wykonywania akcji użytkownika i/lub pobierania wyników zapytań. Kontroler wybiera widok do wyświetlenia użytkownikowi i udostępnia je dowolnym wymaganym danym modelu.

Na poniższym diagramie przedstawiono trzy główne składniki, które odwołują się do pozostałych:

MVC Pattern

To rozdzielenie obowiązków pomaga skalować aplikację pod względem złożoności, ponieważ łatwiej jest kodować, debugować i testować coś (model, widok lub kontroler), które ma jedno zadanie. Trudniej jest zaktualizować, przetestować i debugować kod, który ma zależności rozłożone na co najmniej dwa z tych trzech obszarów. Na przykład logika interfejsu użytkownika zwykle zmienia się częściej niż logika biznesowa. Jeśli kod prezentacji i logika biznesowa są łączone w jednym obiekcie, obiekt zawierający logikę biznesową musi być modyfikowany za każdym razem, gdy interfejs użytkownika zostanie zmieniony. Często wprowadza to błędy i wymaga ponownego testowania logiki biznesowej po każdej minimalnej zmianie interfejsu użytkownika.

Uwaga

Zarówno widok, jak i kontroler zależą od modelu. Jednak model nie zależy od widoku ani kontrolera. Jest to jedna z kluczowych zalet separacji. Ta separacja umożliwia skompilowanie i przetestowanie modelu niezależnie od prezentacji wizualnej.

Obowiązki modelu

Model w aplikacji MVC reprezentuje stan aplikacji oraz dowolną logikę biznesową lub operacje, które powinny być wykonywane przez aplikację. Logika biznesowa powinna być hermetyzowana w modelu wraz z dowolną logiką implementacji w celu utrwalania stanu aplikacji. Silnie typizowane widoki zwykle używają typów ViewModel zaprojektowanych do przechowywania danych do wyświetlenia w tym widoku. Kontroler tworzy i wypełnia te wystąpienia modelu ViewModel.

Wyświetlanie obowiązków

Widoki są odpowiedzialne za prezentowanie zawartości za pośrednictwem interfejsu użytkownika. Używają aparatu wyświetlania do osadzania Razor kodu platformy .NET w adiustacji HTML. W widokach powinna istnieć minimalna logika, a każda z nich logika powinna odnosić się do prezentowania zawartości. Jeśli okaże się, że konieczne jest wykonanie dużej ilości logiki w plikach widoku w celu wyświetlenia danych ze złożonego modelu, rozważ użycie szablonu View Component, ViewModel lub view, aby uprościć widok.

Obowiązki administratora

Kontrolery to składniki, które obsługują interakcję użytkownika, współpracują z modelem, a ostatecznie wybierają widok do renderowania. W aplikacji MVC widok wyświetla tylko informacje; kontroler obsługuje dane wejściowe i interakcje użytkownika oraz reaguje na nie. We wzorcu MVC kontroler jest początkowym punktem wejścia i jest odpowiedzialny za wybór typów modeli, z którymi mają współpracować, oraz z którym widokiem ma być renderowany (stąd jego nazwa — kontroluje sposób, w jaki aplikacja odpowiada na określone żądanie).

Uwaga

Kontrolery nie powinny być zbyt skomplikowane przez zbyt wiele obowiązków. Aby zachować, że logika kontrolera staje się nadmiernie złożona, wypychaj logikę biznesową z kontrolera i do modelu domeny.

Napiwek

Jeśli okaże się, że akcje kontrolera często wykonują te same rodzaje akcji, przenieś te typowe akcje do filtrów.

ASP.NET Core MVC

Struktura ASP.NET Core MVC to uproszczona, wysoce testowalna struktura prezentacji typu open source zoptymalizowana pod kątem użycia z platformą ASP.NET Core.

ASP.NET Core MVC zapewnia oparty na wzorcach sposób tworzenia dynamicznych witryn internetowych, które umożliwiają czystą separację zagadnień. Zapewnia pełną kontrolę nad adiustacjami, obsługuje programowanie przyjazne dla TDD i używa najnowszych standardów internetowych.

Routing

ASP.NET Core MVC opiera się na routingu ASP.NET Core, zaawansowanym składniku mapowania adresów URL, który umożliwia tworzenie aplikacji, które mają zrozumiałe i przeszukiwalne adresy URL. Dzięki temu można zdefiniować wzorce nazewnictwa adresów URL aplikacji, które działają dobrze na potrzeby optymalizacji aparatu wyszukiwania (SEO) i generowania linków, bez względu na sposób organizowania plików na serwerze internetowym. Trasy można zdefiniować przy użyciu wygodnej składni szablonu trasy, która obsługuje ograniczenia wartości trasy, wartości domyślne i opcjonalne.

Routing oparty na konwencji umożliwia globalne definiowanie formatów adresów URL akceptowanych przez aplikację oraz mapowanie każdego z tych formatów na określoną metodę akcji na danym kontrolerze. Po odebraniu żądania przychodzącego aparat routingu analizuje adres URL i dopasuje go do jednego ze zdefiniowanych formatów adresu URL, a następnie wywołuje metodę akcji skojarzonego kontrolera.

routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");

Routing atrybutów umożliwia określenie informacji o routingu przez dekorowanie kontrolerów i akcji za pomocą atrybutów definiujących trasy aplikacji. Oznacza to, że definicje tras są umieszczane obok kontrolera i akcji, z którą są skojarzone.

[Route("api/[controller]")]
public class ProductsController : Controller
{
    [HttpGet("{id}")]
    public IActionResult GetProduct(int id)
    {
      ...
    }
}

Powiązanie modelu

ASP.NET powiązanie modelu MVC core konwertuje dane żądania klienta (wartości formularza, dane trasy, parametry ciągu zapytania, nagłówki HTTP) na obiekty, które może obsłużyć kontroler. W związku z tym logika kontrolera nie musi wykonywać pracy w celu ustalenia danych przychodzących żądań; po prostu zawiera dane jako parametry metod akcji.

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }

Walidacja modelu

ASP.NET Core MVC obsługuje walidację przez dekorowanie obiektu modelu za pomocą atrybutów weryfikacji adnotacji danych. Atrybuty weryfikacji są sprawdzane po stronie klienta przed opublikowaniem wartości na serwerze, a także na serwerze przed wywołanie akcji kontrolera.

using System.ComponentModel.DataAnnotations;
public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Akcja kontrolera:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    if (ModelState.IsValid)
    {
      // work with the model
    }
    // At this point, something failed, redisplay form
    return View(model);
}

Platforma obsługuje weryfikowanie danych żądania zarówno na kliencie, jak i na serwerze. Logika walidacji określona w typach modelu jest dodawana do renderowanych widoków jako nieuprawdzonych adnotacji i jest wymuszana w przeglądarce przy użyciu weryfikacji jQuery.

Wstrzykiwanie zależności

ASP.NET Core ma wbudowaną obsługę wstrzykiwania zależności (DI). W ASP.NET Core MVC kontrolery mogą żądać wymaganych usług za pomocą konstruktorów, co pozwala im przestrzegać zasady jawnych zależności.

Aplikacja może również używać iniekcji zależności w widokach plików przy użyciu @inject dyrektywy :

@inject SomeService ServiceName

<!DOCTYPE html>
<html lang="en">
<head>
    <title>@ServiceName.GetTitle</title>
</head>
<body>
    <h1>@ServiceName.GetTitle</h1>
</body>
</html>

Filtry

Filtry pomagają deweloperom hermetyzować kwestie dotyczące wycinania krzyżowego, takie jak obsługa wyjątków lub autoryzacja. Filtry umożliwiają uruchamianie niestandardowej logiki wstępnego i końcowego przetwarzania dla metod akcji i można je skonfigurować do uruchamiania w określonych punktach w potoku wykonywania dla danego żądania. Filtry można stosować do kontrolerów lub akcji jako atrybutów (lub mogą być uruchamiane globalnie). W strukturze znajduje się kilka filtrów (takich jak Authorize). [Authorize] to atrybut używany do tworzenia filtrów autoryzacji MVC.

[Authorize]
public class AccountController : Controller

Obszary

Obszary umożliwiają partycjonowanie dużej aplikacji internetowej MVC ASP.NET w mniejsze grupy funkcjonalne. Obszar to struktura MVC wewnątrz aplikacji. W projekcie MVC składniki logiczne, takie jak Model, Kontroler i Widok, są przechowywane w różnych folderach, a MVC używa konwencji nazewnictwa do tworzenia relacji między tymi składnikami. W przypadku dużej aplikacji korzystne może być podzielenie aplikacji na oddzielne obszary funkcjonalności wysokiego poziomu. Na przykład aplikacja do handlu elektronicznego z wieloma jednostkami biznesowymi, takimi jak wyewidencjonowanie, rozliczenia i wyszukiwanie itp. Każda z tych jednostek ma własne widoki składników logicznych, kontrolery i modele.

Interfejsy API sieci Web

Oprócz doskonałej platformy do tworzenia witryn internetowych, ASP.NET Core MVC ma doskonałą obsługę tworzenia internetowych interfejsów API. Możesz tworzyć usługi, które docierają do szerokiej gamy klientów, w tym przeglądarek i urządzeń przenośnych.

Platforma obejmuje obsługę negocjacji zawartości HTTP z wbudowaną obsługą formatowania danych w JSformacie ON lub XML. Pisanie niestandardowych formatów w celu dodania obsługi własnych formatów.

Użyj generowania linków, aby włączyć obsługę hipermedia. Łatwo włącz obsługę współużytkowania zasobów między źródłami (CORS), dzięki czemu interfejsy API sieci Web mogą być współużytkowane przez wiele aplikacji internetowych.

Możliwość testowania

Korzystanie z interfejsów i wstrzykiwania zależności w ramach platformy ułatwia testowanie jednostkowe, a platforma zawiera funkcje (takie jak dostawca TestHost i InMemory dla platformy Entity Framework), które ułatwiają szybkie i łatwe testy integracji. Dowiedz się więcej na temat testowania logiki kontrolera.

Razor aparat wyświetlania

ASP.NET podstawowe widoki MVC używają Razor aparatu widoku do renderowania widoków. Razor jest kompaktowym, ekspresywnym i płynnym językiem znaczników szablonów do definiowania widoków przy użyciu osadzonego kodu języka C#. Razor służy do dynamicznego generowania zawartości internetowej na serwerze. Kod serwera można łatwo mieszać z zawartością i kodem po stronie klienta.

<ul>
    @for (int i = 0; i < 5; i++) {
        <li>List item @i</li>
    }
</ul>

Aparat widoków Razor umożliwia definiowanie układów, widoków częściowych i częściowych sekcji.

Silnie typizowane widoki

Razor widoki w modelu MVC mogą być silnie typizowane na podstawie modelu. Kontrolery mogą przekazywać silnie typizowane modele do widoków, dzięki czemu widoki mogą mieć obsługę sprawdzania typów i funkcji IntelliSense.

Na przykład następujący widok renderuje model typu IEnumerable<Product>:

@model IEnumerable<Product>
<ul>
    @foreach (Product p in Model)
    {
        <li>@p.Name</li>
    }
</ul>

Pomocnicy tagów

Pomocnicy tagów umożliwiają udział w tworzeniu i renderowaniu elementów HTML w Razor plikach. Za pomocą pomocników tagów można zdefiniować tagi niestandardowe (na przykład <environment>) lub zmodyfikować zachowanie istniejących tagów (na przykład <label>). Pomocnicy tagów wiążą się z określonymi elementami na podstawie nazwy elementu i jego atrybutów. Zapewniają one korzyści z renderowania po stronie serwera, zachowując jednocześnie środowisko edycji HTML.

Istnieje wiele wbudowanych pomocników tagów dla typowych zadań — takich jak tworzenie formularzy, linków, ładowanie zasobów i nie tylko — a nawet bardziej dostępne w publicznych repozytoriach GitHub i jako pakiety NuGet. Pomocnicy tagów są autorami w języku C#, a elementami docelowymi są elementy HTML na podstawie nazwy elementu, nazwy atrybutu lub tagu nadrzędnego. Na przykład wbudowany element LinkTagHelper może służyć do utworzenia linku do Login akcji elementu AccountsController:

<p>
    Thank you for confirming your email.
    Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>

Może EnvironmentTagHelper służyć do uwzględnienia różnych skryptów w widokach (na przykład nieprzetworzonych lub minyfikowanych) na podstawie środowiska uruchomieniowego, takiego jak programowanie, przemieszczanie lub produkcja:

<environment names="Development">
    <script src="~/lib/jquery/dist/jquery.js"></script>
</environment>
<environment names="Staging,Production">
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.js"
            asp-fallback-test="window.jQuery">
    </script>
</environment>

Pomocnicy tagów zapewniają środowisko programistyczne przyjazne dla języka HTML i bogate środowisko IntelliSense do tworzenia kodu HTML i Razor znaczników. Większość wbudowanych pomocników tagów jest ukierunkowana na istniejące elementy HTML i udostępnia atrybuty po stronie serwera dla elementu.

Wyświetlanie składników

Składniki widoku umożliwiają pakowanie logiki renderowania i ponowne używanie jej w całej aplikacji. Są one podobne do widoków częściowych, ale ze skojarzona logiką.

Wersja zgodności

Metoda SetCompatibilityVersion umożliwia aplikacji rezygnację lub rezygnację z potencjalnie powodujących niezgodność zmian wprowadzonych w ASP.NET Core MVC 2.1 lub nowszej wersji.

Aby uzyskać więcej informacji, zobacz Zgodność wersji ASP.NET Core MVC.

Dodatkowe zasoby