Obsługa żądań z kontrolerami w ASP.NET Core MVCHandle requests with controllers in ASP.NET Core MVC

Steve Kowalski i Scott AddieBy Steve Smith and Scott Addie

Kontrolery, akcje i wyniki akcji są podstawową częścią sposobu, w jaki deweloperzy tworzą aplikacje przy użyciu ASP.NET Core MVC.Controllers, actions, and action results are a fundamental part of how developers build apps using ASP.NET Core MVC.

Co to jest kontroler?What is a Controller?

Kontroler służy do definiowania i grupowania zestawu akcji.A controller is used to define and group a set of actions. Akcja (lub Metoda akcji ) to metoda na kontrolerze, który obsługuje żądania.An action (or action method ) is a method on a controller which handles requests. Kontrolery logicznie grupują podobne działania jednocześnie.Controllers logically group similar actions together. Ta agregacja akcji umożliwia stosowanie wspólnych zestawów reguł, takich jak routing, buforowanie i autoryzacja, które mają być stosowane zbiorczo.This aggregation of actions allows common sets of rules, such as routing, caching, and authorization, to be applied collectively. Żądania są mapowane na akcje za poorednictwem routingu.Requests are mapped to actions through routing.

Według Konwencji, klasy kontrolera:By convention, controller classes:

  • Znajduje się w folderze głównych kontrolerów poziomu projektu.Reside in the project's root-level Controllers folder.
  • Dziedzicz od Microsoft.AspNetCore.Mvc.Controller .Inherit from Microsoft.AspNetCore.Mvc.Controller.

Kontroler jest klasą instantiable, w której spełniony jest co najmniej jeden z następujących warunków:A controller is an instantiable class in which at least one of the following conditions is true:

  • Nazwa klasy jest sufiksem Controller .The class name is suffixed with Controller.
  • Klasa dziedziczy z klasy, której nazwa jest sufiksem Controller .The class inherits from a class whose name is suffixed with Controller.
  • Ten [Controller] atrybut jest stosowany do klasy.The [Controller] attribute is applied to the class.

Klasa kontrolera nie może mieć skojarzonego [NonController] atrybutu.A controller class must not have an associated [NonController] attribute.

Kontrolery powinny przestrzegać zasad jawnych zależności.Controllers should follow the Explicit Dependencies Principle. Istnieje kilka podejścia do implementowania tej zasady.There are a couple of approaches to implementing this principle. Jeśli wiele akcji kontrolera wymaga tej samej usługi, rozważ użycie iniekcji konstruktora , aby zażądać tych zależności.If multiple controller actions require the same service, consider using constructor injection to request those dependencies. Jeśli usługa jest wymagana tylko przez pojedynczą metodę akcji, należy rozważyć użycie iniekcji akcji , aby zażądać zależności.If the service is needed by only a single action method, consider using Action Injection to request the dependency.

W przypadku wzorca M odelu- V każ- C kontroler jest odpowiedzialny za wstępne przetwarzanie żądania i tworzenie wystąpienia modelu.Within the M odel- V iew- C ontroller pattern, a controller is responsible for the initial processing of the request and instantiation of the model. Ogólnie rzecz biorąc, decyzje biznesowe powinny być wykonywane w ramach modelu.Generally, business decisions should be performed within the model.

Kontroler pobiera wynik przetwarzania modelu (jeśli istnieje) i zwraca odpowiedni widok oraz powiązane z nim dane widoku lub wynik wywołania interfejsu API.The controller takes the result of the model's processing (if any) and returns either the proper view and its associated view data or the result of the API call. Dowiedz się więcej na temat ASP.NET Core MVC i rozpocznij pracę z ASP.NET Core MVC i Visual Studio.Learn more at Overview of ASP.NET Core MVC and Get started with ASP.NET Core MVC and Visual Studio.

Kontroler jest abstrakcją poziomu interfejsu użytkownika .The controller is a UI-level abstraction. Celem jest zapewnienie, że dane żądania są prawidłowe i można wybrać widok (lub wynik dla interfejsu API), który ma zostać zwrócony.Its responsibilities are to ensure request data is valid and to choose which view (or result for an API) should be returned. W przypadku aplikacji z obsługą stałej nie obejmuje ona bezpośrednio dostępu do danych ani logiki biznesowej.In well-factored apps, it doesn't directly include data access or business logic. Zamiast tego kontroler delegowany do usług obsługujących te obowiązki.Instead, the controller delegates to services handling these responsibilities.

Definiowanie akcjiDefining Actions

Metody publiczne na kontrolerze, z wyjątkiem tych z [NonAction] atrybutem, są akcjami.Public methods on a controller, except those with the [NonAction] attribute, are actions. Parametry w akcjach są powiązane z danymi żądania i są weryfikowane przy użyciu powiązania modelu.Parameters on actions are bound to request data and are validated using model binding. Walidacja modelu odbywa się dla wszystkich elementów, które są powiązane z modelem.Model validation occurs for everything that's model-bound. ModelState.IsValidWartość właściwości wskazuje, czy powiązanie modelu i walidacja zakończyły się powodzeniem.The ModelState.IsValid property value indicates whether model binding and validation succeeded.

Metody akcji powinny zawierać logikę mapowania żądania do zagadnienia biznesowego.Action methods should contain logic for mapping a request to a business concern. Kwestie biznesowe powinny być zwykle reprezentowane jako usługi, do których kontroler uzyskuje dostęp poprzez iniekcję zależności.Business concerns should typically be represented as services that the controller accesses through dependency injection. Następnie akcje mapują wynik akcji biznesowej do stanu aplikacji.Actions then map the result of the business action to an application state.

Akcje mogą zwracać wszystko, ale często zwracają wystąpienie IActionResult (lub Task<IActionResult> dla metod asynchronicznych), które generuje odpowiedź.Actions can return anything, but frequently return an instance of IActionResult (or Task<IActionResult> for async methods) that produces a response. Metoda akcji jest odpowiedzialna za wybór rodzaju odpowiedzi .The action method is responsible for choosing what kind of response . Wynik akcji wykonuje odpowiedź .The action result does the responding .

Metody pomocnika kontroleraController Helper Methods

Kontrolery zwykle dziedziczą z kontrolera, chociaż nie jest to wymagane.Controllers usually inherit from Controller, although this isn't required. Wyprowadzanie z Controller programu zapewnia dostęp do trzech kategorii metod pomocnika:Deriving from Controller provides access to three categories of helper methods:

1. metody z wynikiem pustej treści odpowiedzi1. Methods resulting in an empty response body

Brak Content-Type nagłówka odpowiedzi HTTP, ponieważ treść odpowiedzi nie zawiera treści do opisania.No Content-Type HTTP response header is included, since the response body lacks content to describe.

W tej kategorii istnieją dwa typy wyników: redirect i kod stanu HTTP.There are two result types within this category: Redirect and HTTP Status Code.

  • Kod stanu HTTPHTTP Status Code

    Ten typ zwraca kod stanu HTTP.This type returns an HTTP status code. Kilka metod pomocnika tego typu to BadRequest , NotFound , i Ok .A couple of helper methods of this type are BadRequest, NotFound, and Ok. Na przykład program return BadRequest(); generuje kod stanu 400 po wykonaniu.For example, return BadRequest(); produces a 400 status code when executed. Gdy metody takie jak BadRequest , NotFound i Ok są przeciążone, nie kwalifikują się do odpowiedzi na kod stanu HTTP, ponieważ odbywa się negocjowanie zawartości.When methods such as BadRequest, NotFound, and Ok are overloaded, they no longer qualify as HTTP Status Code responders, since content negotiation is taking place.

  • PrzekierowanieRedirect

    Ten typ zwraca przekierowanie do akcji lub lokalizacji docelowej (przy użyciu Redirect , LocalRedirect , RedirectToAction lub RedirectToRoute ).This type returns a redirect to an action or destination (using Redirect, LocalRedirect, RedirectToAction, or RedirectToRoute). Na przykład return RedirectToAction("Complete", new {id = 123}); przekierowuje do Complete , przekazując obiekt anonimowy.For example, return RedirectToAction("Complete", new {id = 123}); redirects to Complete, passing an anonymous object.

    Typ wyniku przekierowania różni się od typu kodu stanu HTTP przede wszystkim przy dodawaniu Location nagłówka odpowiedzi HTTP.The Redirect result type differs from the HTTP Status Code type primarily in the addition of a Location HTTP response header.

2. metody, które w wyniku niepustej treści odpowiedzi ze wstępnie zdefiniowanym typem zawartości2. Methods resulting in a non-empty response body with a predefined content type

Większość metod pomocniczych w tej kategorii zawiera ContentType Właściwość, co pozwala na określenie Content-Type nagłówka odpowiedzi opisującego treść odpowiedzi.Most helper methods in this category include a ContentType property, allowing you to set the Content-Type response header to describe the response body.

W tej kategorii istnieją dwa typy wyników: Wyświetl i sformatowaną odpowiedź.There are two result types within this category: View and Formatted Response.

  • WyświetlanieView

    Ten typ zwraca widok, który używa modelu do renderowania kodu HTML.This type returns a view which uses a model to render HTML. Na przykład return View(customer); przekazuje model do widoku dla powiązania danych.For example, return View(customer); passes a model to the view for data-binding.

  • Sformatowana odpowiedźFormatted Response

    Ten typ zwraca kod JSON lub podobny format wymiany danych, aby reprezentować obiekt w określony sposób.This type returns JSON or a similar data exchange format to represent an object in a specific manner. Na przykład return Json(customer); Serializacja podanego obiektu w formacie JSON.For example, return Json(customer); serializes the provided object into JSON format.

    Inne popularne metody tego typu obejmują File i PhysicalFile .Other common methods of this type include File and PhysicalFile. Na przykład return PhysicalFile(customerFilePath, "text/xml"); zwraca PhysicalFileResult.For example, return PhysicalFile(customerFilePath, "text/xml"); returns PhysicalFileResult.

3. metody powodujące niepustą treść odpowiedzi sformatowaną w typie zawartości negocjowanej z klientem3. Methods resulting in a non-empty response body formatted in a content type negotiated with the client

Ta kategoria jest lepiej znana jako negocjowanie zawartości .This category is better known as Content Negotiation . Negocjowanie zawartości ma zastosowanie zawsze, gdy akcja zwraca typ ObjectResult lub coś innego niż implementacja IActionResult .Content negotiation applies whenever an action returns an ObjectResult type or something other than an IActionResult implementation. Akcja zwracająca brak IActionResult implementacji (na przykład object ) zwraca również sformatowaną odpowiedź.An action that returns a non-IActionResult implementation (for example, object) also returns a Formatted Response.

Niektóre metody pomocnika tego typu obejmują BadRequest , CreatedAtRoute , i Ok .Some helper methods of this type include BadRequest, CreatedAtRoute, and Ok. Przykłady tych metod obejmują return BadRequest(modelState); odpowiednio, return CreatedAtRoute("routename", values, newobject); i return Ok(value); .Examples of these methods include return BadRequest(modelState);, return CreatedAtRoute("routename", values, newobject);, and return Ok(value);, respectively. Należy pamiętać, że BadRequest i Ok przeprowadzić negocjację zawartości tylko wtedy, gdy przekazała wartość; bez przekazywania wartości, zamiast tego jako typy wyników kodu stanu HTTP.Note that BadRequest and Ok perform content negotiation only when passed a value; without being passed a value, they instead serve as HTTP Status Code result types. Z CreatedAtRoute drugiej strony Metoda zawsze wykonuje negocjację zawartości, ponieważ jej przeciążenia wymagają, aby wartość została przekazana.The CreatedAtRoute method, on the other hand, always performs content negotiation since its overloads all require that a value be passed.

Zagadnienia dotyczące wycinaniaCross-Cutting Concerns

Aplikacje zwykle udostępniają części ich przepływu pracy.Applications typically share parts of their workflow. Przykładem może być aplikacja wymagająca uwierzytelniania w celu uzyskania dostępu do koszyka lub aplikacja, która przechowuje dane na niektórych stronach.Examples include an app that requires authentication to access the shopping cart, or an app that caches data on some pages. Aby wykonać logikę przed lub po metodzie akcji, użyj filtru .To perform logic before or after an action method, use a filter . Użycie filtrów na temat zagadnień związanych z rozcinaniem może zmniejszyć liczbę operacji duplikowania.Using Filters on cross-cutting concerns can reduce duplication.

Większość atrybutów filtru, takich jak [Authorize] , może być stosowana na poziomie kontrolera lub akcji w zależności od wymaganego poziomu szczegółowości.Most filter attributes, such as [Authorize], can be applied at the controller or action level depending upon the desired level of granularity.

Obsługa błędów i buforowanie odpowiedzi często są związane z obcinaniem:Error handling and response caching are often cross-cutting concerns:

Wiele zagadnień związanych z wycinaniem można obsłużyć za pomocą filtrów lub niestandardowych programów pośredniczących.Many cross-cutting concerns can be handled using filters or custom middleware.