Omówienie platformy ASP.NET Core MVCOverview of ASP.NET Core MVC

Przez Steve SmithBy Steve Smith

ASP.NET Core MVC to rozbudowana platforma służąca do tworzenia aplikacji sieci Web i interfejsów API przy użyciu wzorca projektowego modelu widoku.ASP.NET Core MVC is a rich framework for building web apps and APIs using the Model-View-Controller design pattern.

Co to jest wzorzec MVC?What is the MVC pattern?

Wzorzec architektoniczny Model-View-Controller (MVC) oddziela aplikację do trzech głównych grup składników: modeli, widoków i kontrolerów.The Model-View-Controller (MVC) architectural pattern separates an application into three main groups of components: Models, Views, and Controllers. Ten wzorzec pozwala uzyskać rozdzielenie obaw.This pattern helps to achieve separation of concerns. 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ń.Using this pattern, user requests are routed to a Controller which is responsible for working with the Model to perform user actions and/or retrieve results of queries. Kontroler wybierze widok, który ma być wyświetlany użytkownikowi, i udostępnia mu wymagane dane modelu.The Controller chooses the View to display to the user, and provides it with any Model data it requires.

Na poniższym diagramie przedstawiono trzy główne składniki, które odwołują się do innych:The following diagram shows the three main components and which ones reference the others:

Wzorzec MVC

Ten podział obowiązków pomaga skalować aplikację pod kątem złożoności, ponieważ ułatwia to kod, debugowanie i testowanie elementu (model, widok lub kontroler), który ma pojedyncze zadanie.This delineation of responsibilities helps you scale the application in terms of complexity because it's easier to code, debug, and test something (model, view, or controller) that has a single job. Jest trudniejsze, aby aktualizować, testować i debugować kod, który ma zależności rozłożone na dwa lub więcej z tych trzech obszarów.It's more difficult to update, test, and debug code that has dependencies spread across two or more of these three areas. Na przykład logika interfejsu użytkownika zmienia się częściej niż logika biznesowa.For example, user interface logic tends to change more frequently than business logic. Jeśli kod prezentacji i logika biznesowa są łączone w pojedynczym obiekcie, obiekt zawierający logikę biznesową musi być modyfikowany za każdym razem, gdy interfejs użytkownika jest zmieniany.If presentation code and business logic are combined in a single object, an object containing business logic must be modified every time the user interface is changed. Często wprowadza błędy i wymaga przetestowania logiki biznesowej po każdym minimalnym zmianie interfejsu użytkownika.This often introduces errors and requires the retesting of business logic after every minimal user interface change.

Uwaga

Zarówno widok, jak i kontroler zależą od modelu.Both the view and the controller depend on the model. Jednak model jest zależny od widoku, a nie kontrolera.However, the model depends on neither the view nor the controller. Jest to jedna z najważniejszych zalet separacji.This is one of the key benefits of the separation. Ta separacja umożliwia skompilowanie i przetestowanie modelu niezależnie od prezentacji wizualnej.This separation allows the model to be built and tested independent of the visual presentation.

Obowiązki związane z modelemModel Responsibilities

Model w aplikacji MVC reprezentuje stan aplikacji i wszelkie operacje logiki biznesowej, które powinny być wykonywane przez nią.The Model in an MVC application represents the state of the application and any business logic or operations that should be performed by it. Logika biznesowa powinna być hermetyzowana w modelu wraz z dowolnymi regułami implementacji dotyczącymi utrwalania stanu aplikacji.Business logic should be encapsulated in the model, along with any implementation logic for persisting the state of the application. Widoki z jednoznacznie określonymi typami zazwyczaj używają typów ViewModel zaprojektowanych do przechowywania danych do wyświetlenia w tym widoku.Strongly-typed views typically use ViewModel types designed to contain the data to display on that view. Kontroler tworzy i wypełnia te wystąpienia ViewModel z modelu.The controller creates and populates these ViewModel instances from the model.

Wyświetl obowiązkiView Responsibilities

Widoki są odpowiedzialne za prezentowanie zawartości za pomocą interfejsu użytkownika.Views are responsible for presenting content through the user interface. Używają one Razor aparatu widoku do osadzania kodu platformy .NET w znaczniku html.They use the Razor view engine to embed .NET code in HTML markup. W widokach powinna być minimalna logika, a jakakolwiek logika powinna odnosić się do treści prezentacji.There should be minimal logic within views, and any logic in them should relate to presenting content. Jeśli okaże się, że trzeba wykonać znaczną transakcję logiki w plikach widoku, aby wyświetlić dane z modelu złożonego, należy rozważyć użycie składnika widoku, ViewModel lub szablonu widoku, aby uprościć widok.If you find the need to perform a great deal of logic in view files in order to display data from a complex model, consider using a View Component, ViewModel, or view template to simplify the view.

Obowiązki kontroleraController Responsibilities

Kontrolery są składnikami, które obsługują interakcję z użytkownikiem, pracują z modelem i ostatecznie wybierają widok do renderowania.Controllers are the components that handle user interaction, work with the model, and ultimately select a view to render. W aplikacji MVC widok wyświetla tylko informacje; kontroler obsługuje i reaguje na dane wejściowe użytkownika i interakcje.In an MVC application, the view only displays information; the controller handles and responds to user input and interaction. We wzorcu MVC kontroler jest punktem wejścia, który jest odpowiedzialny za wybór typów modelu do pracy i widok do renderowania (w związku z czym jego nazwa określa, jak aplikacja odpowiada na daną prośbę).In the MVC pattern, the controller is the initial entry point, and is responsible for selecting which model types to work with and which view to render (hence its name - it controls how the app responds to a given request).

Uwaga

Kontrolery nie powinny być nadmiernie skomplikowane przez zbyt wiele obowiązków.Controllers shouldn't be overly complicated by too many responsibilities. Aby zachować logikę kontrolera przed nadmierną złożonością, wypychanie logiki biznesowej z kontrolera i do modelu domeny.To keep controller logic from becoming overly complex, push business logic out of the controller and into the domain model.

Porada

Jeśli okaże się, że akcje wykonywane przez kontroler często wykonują tego samego rodzaju akcje, przenieś te typowe akcje do filtrów.If you find that your controller actions frequently perform the same kinds of actions, move these common actions into filters.

Co to jest ASP.NET Core MVCWhat is ASP.NET Core MVC

ASP.NET Core MVC Framework jest lekkim, wysoce weryfikowalne środowiskiem prezentacji zoptymalizowanym pod kątem używania z ASP.NET Core.The ASP.NET Core MVC framework is a lightweight, open source, highly testable presentation framework optimized for use with ASP.NET Core.

ASP.NET Core MVC oferuje oparty na wzorcach sposób tworzenia dynamicznych witryn sieci Web, które umożliwiają czyste rozdzielenie problemów.ASP.NET Core MVC provides a patterns-based way to build dynamic websites that enables a clean separation of concerns. Zapewnia pełną kontrolę nad znacznikiem, obsługuje programowanie przyjaznych dla TDD i używa najnowszych standardów sieci Web.It gives you full control over markup, supports TDD-friendly development and uses the latest web standards.

FunkcjeFeatures

ASP.NET Core MVC obejmuje następujące elementy:ASP.NET Core MVC includes the following:

RoutingRouting

ASP.NET Core MVC jest oparty na routingu ASP.NET Core, czyli zaawansowanym składniku mapowania adresów URL, który umożliwia tworzenie aplikacji, które mają zrozumiały i przeszukiwany adres URL.ASP.NET Core MVC is built on top of ASP.NET Core's routing, a powerful URL-mapping component that lets you build applications that have comprehensible and searchable URLs. Pozwala to definiować wzorce nazewnictwa adresów URL aplikacji, które dobrze sprawdzają się w przypadku optymalizacji aparatu wyszukiwania (wyszukiwarki) i generowania linków, bez względu na sposób organizowania plików na serwerze sieci Web.This enables you to define your application's URL naming patterns that work well for search engine optimization (SEO) and for link generation, without regard for how the files on your web server are organized. Trasy można definiować przy użyciu wygodnej składni szablonu trasy, która obsługuje ograniczenia wartości tras, wartości domyślne i opcjonalne.You can define your routes using a convenient route template syntax that supports route value constraints, defaults and optional values.

Routing oparty na Konwencji umożliwia globalne Definiowanie formatów adresów URL akceptowanych przez aplikację oraz sposobu mapowania poszczególnych formatów na określoną metodę akcji na danym kontrolerze.Convention-based routing enables you to globally define the URL formats that your application accepts and how each of those formats maps to a specific action method on given controller. Po odebraniu żądania przychodzącego aparat routingu analizuje adres URL i dopasowuje go do jednego ze zdefiniowanych formatów adresów URL, a następnie wywołuje metodę akcji skojarzonego kontrolera.When an incoming request is received, the routing engine parses the URL and matches it to one of the defined URL formats, and then calls the associated controller's action method.

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

Routing atrybutu umożliwia określenie informacji o routingu przez dekorowania nazwy kontrolerów i akcji przy użyciu atrybutów, które definiują trasy aplikacji.Attribute routing enables you to specify routing information by decorating your controllers and actions with attributes that define your application's routes. Oznacza to, że definicje tras są umieszczane obok kontrolera i akcji, z którymi są skojarzone.This means that your route definitions are placed next to the controller and action with which they're associated.

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

Powiązanie modeluModel binding

ASP.NET Core powiązanie modelu MVC konwertuje dane żądania klienta (wartości formularza, dane tras, parametry ciągu zapytania, nagłówki HTTP) na obiekty, które może obsłużyć kontroler.ASP.NET Core MVC model binding converts client request data (form values, route data, query string parameters, HTTP headers) into objects that the controller can handle. W związku z tym logika kontrolera nie musi wykonywać zadań, aby wyrównać dane żądania przychodzącego; po prostu zawiera dane jako parametry do metod akcji.As a result, your controller logic doesn't have to do the work of figuring out the incoming request data; it simply has the data as parameters to its action methods.

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

Walidacja modeluModel validation

ASP.NET Core MVC obsługuje walidację przez dekorowania nazwy obiektu modelu z atrybutami walidacji adnotacji danych.ASP.NET Core MVC supports validation by decorating your model object with data annotation validation attributes. Atrybuty walidacji są sprawdzane po stronie klienta, zanim wartości są ogłaszane na serwerze, a także na serwerze przed wywołaniem akcji kontrolera.The validation attributes are checked on the client side before values are posted to the server, as well as on the server before the controller action is called.

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:A controller action:

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 walidację danych żądania zarówno na kliencie, jak i na serwerze.The framework handles validating request data both on the client and on the server. Logika walidacji określona w typach modeli jest dodawana do renderowanych widoków jako niedyskretne adnotacje i wymuszane w przeglądarce przy użyciu walidacji jQuery.Validation logic specified on model types is added to the rendered views as unobtrusive annotations and is enforced in the browser with jQuery Validation.

Wstrzykiwanie zależnościDependency injection

ASP.NET Core ma wbudowaną obsługę iniekcji zależności (di).ASP.NET Core has built-in support for dependency injection (DI). W ASP.NET Core MVC Kontrolery mogą zażądać wymaganych usług za pomocą ich konstruktorów, umożliwiając im przestrzeganie zasad jawnych zależności.In ASP.NET Core MVC, controllers can request needed services through their constructors, allowing them to follow the Explicit Dependencies Principle.

Twoja aplikacja może również używać iniekcji zależności w plikach widokuprzy użyciu @inject dyrektywy:Your app can also use dependency injection in view files, using the @inject directive:

@inject SomeService ServiceName

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

FiltryFilters

Filtry ułatwiają deweloperom hermetyzację zagadnień związanych z zmniejszeniem, takich jak obsługa wyjątków czy autoryzacja.Filters help developers encapsulate cross-cutting concerns, like exception handling or authorization. Filtry umożliwiają uruchamianie niestandardowej logiki sprzed i po przetworzeniu dla metod akcji i można ją skonfigurować do uruchamiania w określonych punktach w potoku wykonywania dla danego żądania.Filters enable running custom pre- and post-processing logic for action methods, and can be configured to run at certain points within the execution pipeline for a given request. Filtry mogą być stosowane do kontrolerów lub akcji jako atrybuty (lub mogą być uruchamiane globalnie).Filters can be applied to controllers or actions as attributes (or can be run globally). W strukturze uwzględniono kilka filtrów (takich jak Authorize ).Several filters (such as Authorize) are included in the framework. [Authorize] jest atrybutem używanym do tworzenia filtrów autoryzacji MVC.[Authorize] is the attribute that is used to create MVC authorization filters.

[Authorize]
public class AccountController : Controller

ObszaryAreas

Obszary umożliwiają partycjonowanie dużej aplikacji sieci Web MVC ASP.NET Core w mniejszych grupach funkcjonalnych.Areas provide a way to partition a large ASP.NET Core MVC Web app into smaller functional groupings. Obszar jest strukturą MVC wewnątrz aplikacji.An area is an MVC structure inside an application. W projekcie MVC składniki logiczne, takie jak model, kontroler i widok, są przechowywane w różnych folderach, a MVC używają konwencji nazewnictwa, aby utworzyć relację między tymi składnikami.In an MVC project, logical components like Model, Controller, and View are kept in different folders, and MVC uses naming conventions to create the relationship between these components. W przypadku dużej aplikacji warto podzielić aplikację na oddzielne obszary wysokiego poziomu funkcji.For a large app, it may be advantageous to partition the app into separate high level areas of functionality. Na przykład aplikacja handlu elektronicznego z wieloma jednostkami biznesowymi, takimi jak wyewidencjonowywanie, rozliczenia i wyszukiwanie, itp. Każda z tych jednostek ma własne widoki, kontrolery i modele logicznego składnika.For instance, an e-commerce app with multiple business units, such as checkout, billing, and search etc. Each of these units have their own logical component views, controllers, and models.

Interfejsy API sieci WebWeb APIs

Poza doskonałym platformą do tworzenia witryn sieci Web, ASP.NET Core MVC ma doskonałą obsługę tworzenia interfejsów API sieci Web.In addition to being a great platform for building web sites, ASP.NET Core MVC has great support for building Web APIs. Możesz tworzyć usługi, które docierają do szerokiego zakresu klientów, w tym przeglądarek i urządzeń przenośnych.You can build services that reach a broad range of clients including browsers and mobile devices.

Platforma obejmuje obsługę negocjacji zawartości HTTP z wbudowaną obsługą formatowania danych jako JSON lub XML.The framework includes support for HTTP content-negotiation with built-in support to format data as JSON or XML. Napisz niestandardowe elementy formatujące , aby dodać obsługę własnych formatów.Write custom formatters to add support for your own formats.

Użyj generowania linków, aby włączyć obsługę multimediów.Use link generation to enable support for hypermedia. Łatwo Włącz obsługę udostępniania zasobów między źródłami (CORS) , aby interfejsy API sieci Web mogły być współużytkowane przez wiele aplikacji sieci Web.Easily enable support for cross-origin resource sharing (CORS) so that your Web APIs can be shared across multiple Web applications.

TestowalnościTestability

Korzystanie z interfejsów i iniekcja zależności umożliwia odpowiednie rozwiązanie do testowania jednostkowego, a platforma obejmuje funkcje (takie jak TestHost i Dostawca pamięci dla Entity Framework), które umożliwiają szybkie i łatwe testowanie integracji .The framework's use of interfaces and dependency injection make it well-suited to unit testing, and the framework includes features (like a TestHost and InMemory provider for Entity Framework) that make integration tests quick and easy as well. Dowiedz się więcej na temat testowania logiki kontrolera.Learn more about how to test controller logic.

Razor Wyświetl aparatRazor view engine

ASP.NET Core widoki MVC wykorzystują Razor aparat widoku do renderowania widoków.ASP.NET Core MVC views use the Razor view engine to render views. Razor to zwarty, wyraźny i płynny język znaczników szablonów do definiowania widoków przy użyciu osadzonego kodu w języku C#.Razor is a compact, expressive and fluid template markup language for defining views using embedded C# code. Razor służy do dynamicznego generowania zawartości sieci Web na serwerze.Razor is used to dynamically generate web content on the server. Można wyczyścić kod serwera z zawartością i kodem po stronie klienta.You can cleanly mix server code with client side content and code.

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

Korzystając z Razor aparatu widoku, można definiować układy, częściowe widoki i przemieścić sekcje.Using the Razor view engine you can define layouts, partial views and replaceable sections.

Widoki o jednoznacznie określonym typieStrongly typed views

Razor widoki w MVC można jednoznacznie wpisywać na podstawie modelu.Razor views in MVC can be strongly typed based on your model. Kontrolery mogą przekazać silnie wpisany model do widoków, co umożliwia kontrolowanie typów i obsługę technologii IntelliSense.Controllers can pass a strongly typed model to views enabling your views to have type checking and IntelliSense support.

Na przykład następujący widok renderuje model typu IEnumerable<Product> :For example, the following view renders a model of type IEnumerable<Product>:

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

Pomocnicy tagówTag Helpers

Pomocnicy tagów Włącz kod po stronie serwera, aby wziąć udział w tworzeniu i RENDEROWANIU elementów HTML w Razor plikach.Tag Helpers enable server side code to participate in creating and rendering HTML elements in Razor files. Za pomocą pomocników tagów można definiować niestandardowe znaczniki (na przykład <environment> ) lub modyfikować zachowanie istniejących tagów (na przykład <label> ).You can use tag helpers to define custom tags (for example, <environment>) or to modify the behavior of existing tags (for example, <label>). Pomocnicy tagów powiążą się z określonymi elementami na podstawie nazwy elementu i jego atrybutów.Tag Helpers bind to specific elements based on the element name and its attributes. Zapewniają one zalety renderowania po stronie serwera, zachowując jednocześnie środowisko edycji HTML.They provide the benefits of server-side rendering while still preserving an HTML editing experience.

Istnieje wiele wbudowanych pomocników tagów dla typowych zadań, takich jak tworzenie formularzy, linków, ładowanie zasobów i inne — a nawet więcej dostępnych w publicznych repozytoriach GitHub i jako pakiety NuGet.There are many built-in Tag Helpers for common tasks - such as creating forms, links, loading assets and more - and even more available in public GitHub repositories and as NuGet packages. Pomocnicy tagów są twórcy w języku C# i są elementami docelowymi elementów HTML w oparciu o nazwę elementu, nazwę atrybutu lub tag nadrzędny.Tag Helpers are authored in C#, and they target HTML elements based on element name, attribute name, or parent tag. Na przykład wbudowana LinkTagHelper może służyć do tworzenia linku do Login akcji AccountsController :For example, the built-in LinkTagHelper can be used to create a link to the Login action of the AccountsController:

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

EnvironmentTagHelperMoże służyć do uwzględnienia różnych skryptów w widokach (na przykład Raw lub zminimalizowanego) w oparciu o środowisko uruchomieniowe, takie jak programowanie, przemieszczanie lub produkcja:The EnvironmentTagHelper can be used to include different scripts in your views (for example, raw or minified) based on the runtime environment, such as Development, Staging, or Production:

<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.min.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
            asp-fallback-test="window.jQuery">
    </script>
</environment>

Pomocnicy tagów zapewniają przyjazne dla języka HTML środowisko programistyczne i zaawansowane środowisko IntelliSense do tworzenia kodu HTML i Razor znaczników.Tag Helpers provide an HTML-friendly development experience and a rich IntelliSense environment for creating HTML and Razor markup. Większość wbudowanych pomocników tagów docelowo istniejące elementy HTML i udostępniają atrybuty po stronie serwera dla elementu.Most of the built-in Tag Helpers target existing HTML elements and provide server-side attributes for the element.

Wyświetl składnikiView Components

Składniki widoku umożliwiają pakowanie logiki renderowania i ponowne używanie jej w całej aplikacji.View Components allow you to package rendering logic and reuse it throughout the application. Są one podobne do widoków częściowych, ale ze skojarzoną logiką.They're similar to partial views, but with associated logic.

Wersja zgodnościCompatibility version

SetCompatibilityVersionMetoda pozwala aplikacji na zgodę lub rezygnację z ewentualnych zmian w zachowaniu, wprowadzonych w ASP.NET Core MVC 2,1 lub nowszych.The SetCompatibilityVersion method allows an app to opt-in or opt-out of potentially breaking behavior changes introduced in ASP.NET Core MVC 2.1 or later.

Aby uzyskać więcej informacji, zobacz Wersja zgodności dla ASP.NET Core MVC.For more information, see Wersja zgodności dla ASP.NET Core MVC.

Dodatkowe zasobyAdditional resources