Verarbeiten von Anforderungen mit Controllern in ASP.NET Core MVCHandle requests with controllers in ASP.NET Core MVC

Von Steve Smith und Scott AddieBy Steve Smith and Scott Addie

Controller, Aktionen und Folgen von Aktionen sind ein wesentlicher Bestandteil der App-Entwicklung mit ASP.NET Core MVC.Controllers, actions, and action results are a fundamental part of how developers build apps using ASP.NET Core MVC.

Was ist ein Controller?What is a Controller?

Ein Controller wird verwendet, um mehrere Aktionen zu definieren und zu gruppieren.A controller is used to define and group a set of actions. Eine Aktion (oder eine Aktionsmethode) ist eine Methode in einem Controller, der Abfragen behandelt.An action (or action method) is a method on a controller which handles requests. Controller gruppieren ähnliche Aktionen auf logische Weise.Controllers logically group similar actions together. Diese Aktionsaggregation ermöglicht das Anwenden gemeinsamer Regeln, wie z.B. für das Routing, Caching und die Autorisierung.This aggregation of actions allows common sets of rules, such as routing, caching, and authorization, to be applied collectively. Anforderungen werden Aktionen über Routing zugeordnet.Requests are mapped to actions through routing.

Per Konvention trifft Folgendes auf Controllerklassen zu:By convention, controller classes:

  • Sie befinden sich im Ordner Controllers auf Stammebene des Projekts.Reside in the project's root-level Controllers folder.
  • Stellen Sie sicher, dass Ihre Klasse von der Klasse Microsoft.AspNetCore.Mvc.Controller erbt.Inherit from Microsoft.AspNetCore.Mvc.Controller.

Ein Controller ist eine Klasse, die instanziiert werden kann und auf die mindestens eine der folgenden Bedingungen zutrifft:A controller is an instantiable class in which at least one of the following conditions is true:

  • An den Klassennamen ist Controller angehängt.The class name is suffixed with Controller.
  • Die Klasse erbt von einer Klasse, an deren Namen Controller angehängt ist.The class inherits from a class whose name is suffixed with Controller.
  • Das [Controller]-Attribut wird auf die Klasse angewendet.The [Controller] attribute is applied to the class.

Die Controllerklasse darf kein verknüpftes [NonController]-Attribut aufweisen.A controller class must not have an associated [NonController] attribute.

Controller sollten dem Prinzip der expliziten Abhängigkeiten folgen.Controllers should follow the Explicit Dependencies Principle. Zum Umsetzen dieses Prinzips gibt es mehrere Herangehensweisen.There are a couple of approaches to implementing this principle. Wenn mehrere Controlleraktionen den gleichen Dienst erfordern, ziehen Sie Constructor Injection zum Anfordern dieser Abhängigkeiten in Erwägung.If multiple controller actions require the same service, consider using constructor injection to request those dependencies. Wenn der Dienst nur von einer einzigen Aktionsmethode benötigt wird, ist Action Injection möglicherweise nützlich.If the service is needed by only a single action method, consider using Action Injection to request the dependency.

Im Muster Model-View-Controller ist ein Controller für die erste Verarbeitung der Anforderung und die Instanziierung des Modells zuständig.Within the Model-View-Controller pattern, a controller is responsible for the initial processing of the request and instantiation of the model. Für gewöhnlich sollten Unternehmensentscheidungen innerhalb des Modell getroffen werden.Generally, business decisions should be performed within the model.

Der Controller nimmt das Ergebnis der Verarbeitung des Modells (falls es ein Ergebnis gibt) an und gibt entweder die geeignete Ansicht mit den verknüpften Ansichtsdaten oder das Ergebnis des API-Aufrufs zurück.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. In den folgenden Artikeln erfahren Sie mehr: Übersicht über ASP.NET Core MVC und Erste Schritte mit ASP.NET Core MVC und Visual Studio.Learn more at Overview of ASP.NET Core MVC and Get started with ASP.NET Core MVC and Visual Studio.

Der Controller ist eine Abstraktion auf Ebene der Benutzeroberfläche.The controller is a UI-level abstraction. Er ist dafür zuständig, die Gültigkeit von Anfragedaten zu gewährleisten und die zurückzugebende Ansicht auszuwählen.Its responsibilities are to ensure request data is valid and to choose which view (or result for an API) should be returned. In gut gestalteten Apps schließt er nicht direkt Datenzugriff oder Geschäftslogik ein.In well-factored apps, it doesn't directly include data access or business logic. Stattdessen delegiert der Controller an Dienste, die an diesen Stellen zuständig sind.Instead, the controller delegates to services handling these responsibilities.

Definieren von AktionenDefining Actions

Öffentliche Methoden in Controllern sind Aktionen, mit Ausnahme von Methoden mit [NonAction]-Attributen.Public methods on a controller, except those with the [NonAction] attribute, are actions. Parameter in Aktionen werden an Anforderungsdaten gebunden und mit Modellbindungen überprüft.Parameters on actions are bound to request data and are validated using model binding. Die Modellüberprüfung erfolgt für alle an Modelle gebundene Elemente.Model validation occurs for everything that's model-bound. Der ModelState.IsValid-Eigenschaftenwert gibt an, ob die Modellbindung und -überprüfung erfolgreich war.The ModelState.IsValid property value indicates whether model binding and validation succeeded.

Aktionsmethoden sollten Logik zum Zuordnen einer Anforderung zu einem Unternehmen beinhalten.Action methods should contain logic for mapping a request to a business concern. Unternehmen sollten normalerweise durch einen Dienst dargestellt werden, auf die der Controller über Dependency Injection zugreift.Business concerns should typically be represented as services that the controller accesses through dependency injection. Anschließend ordnen Aktionen das Ergebnis der Unternehmensaktion einem Anwendungszustand zu.Actions then map the result of the business action to an application state.

Aktionen können ein beliebiges Element zurückgeben. Häufig geben Sie jedoch eine Instanz von IActionResult (oder für async-Methoden eine Instanz von Task<IActionResult>) zurück, die eine Antwort erzeugt.Actions can return anything, but frequently return an instance of IActionResult (or Task<IActionResult> for async methods) that produces a response. Die Aktionsmethode ist dafür zuständig, die Art der Antwort auszuwählen.The action method is responsible for choosing what kind of response. Das Aktionsergebnis antwortet.The action result does the responding.

Hilfsmethoden von ControllernController Helper Methods

Controller erben üblicherweise von Controller, auch wenn dies nicht erforderlich ist.Controllers usually inherit from Controller, although this isn't required. Das Ableiten von Controller ermöglicht den Zugriff auf drei verschiedene Arten von Hilfsmethoden:Deriving from Controller provides access to three categories of helper methods:

1. Methoden, die zu einem leeren Antworttext führen1. Methods resulting in an empty response body

Es ist kein Content-Type-HTTP-Antwortheader beinhaltet, da der Antworttext keinen Inhalt aufweist, der beschrieben werden könnte.No Content-Type HTTP response header is included, since the response body lacks content to describe.

Innerhalb dieser Kategorie gibt es wiederum zwei Ergebnistypen: Redirect (Umleiten) oder HTTP-Statuscode.There are two result types within this category: Redirect and HTTP Status Code.

  • HTTP-Status CodeHTTP Status Code

    Dieser Typ gibt einen HTTP-Statuscode zurück.This type returns an HTTP status code. Beispiele für Hilfsmethoden dieses Typs sind BadRequest, NotFound und Ok.A couple of helper methods of this type are BadRequest, NotFound, and Ok. return BadRequest(); erzeugt beispielsweise bei der Ausführung den Statuscode 400.For example, return BadRequest(); produces a 400 status code when executed. Wenn Methoden wie BadRequest, NotFound und Ok überladen werden, gelten sie nicht länger als HTTP-Statuscode-Antwortdienste, da eine Inhaltsaushandlung stattfindet.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.

  • UmleitenRedirect

    Dieser Typ gibt eine Umleitung an eine Aktion oder ein Ziel zurück (unter Verwendung von Redirect, LocalRedirect, RedirectToAction oder RedirectToRoute).This type returns a redirect to an action or destination (using Redirect, LocalRedirect, RedirectToAction, or RedirectToRoute). return RedirectToAction("Complete", new {id = 123}); leitet beispielsweise an Complete um und übergibt ein anonymes Objekt.For example, return RedirectToAction("Complete", new {id = 123}); redirects to Complete, passing an anonymous object.

    Der Ergebnistyp „Redirect“ unterscheidet sich vom Typ „HTTP-Statuscode“ zunächst dahingehend, dass er über einen Location-HTTP-Antwortheader verfügt.The Redirect result type differs from the HTTP Status Code type primarily in the addition of a Location HTTP response header.

2. Methoden, die zu einem nicht leeren Antworttext mit einem vordefinierten Inhaltstyp führen2. Methods resulting in a non-empty response body with a predefined content type

Die meisten Hilfsmethoden in dieser Kategorie beinhalten eine ContentType-Eigenschaft, mit der Sie den Antwortheader Content-Type festlegen können, um den Antworttext zu beschreiben.Most helper methods in this category include a ContentType property, allowing you to set the Content-Type response header to describe the response body.

Innerhalb dieser Kategorie gibt es wiederum zwei Ergebnistypen: View (Ansicht) und Formatted Response (Formatierte Antwort).There are two result types within this category: View and Formatted Response.

  • AnzeigenView

    Dieser Typ gibt eine Ansicht zurück, die ein Modell zum Rendern von HTML verwendet.This type returns a view which uses a model to render HTML. return View(customer); übergibt beispielsweise zur Datenbindung ein Modell an die Ansicht.For example, return View(customer); passes a model to the view for data-binding.

  • Formatierte AntwortFormatted Response

    Dieser Typ gibt eine Datei im JSON-Format oder in einem ähnlichen Datenaustauschformat zurück, um ein Objekt auf eine bestimmte Weise darzustellen.This type returns JSON or a similar data exchange format to represent an object in a specific manner. return Json(customer); serialisiert beispielsweise das bereitgestellte Objekt im JSON-Format.For example, return Json(customer); serializes the provided object into JSON format.

    Weitere gängige Methoden dieses Typs sind File und PhysicalFile.Other common methods of this type include File and PhysicalFile. return PhysicalFile(customerFilePath, "text/xml"); gibt beispielsweise PhysicalFileResult zurück.For example, return PhysicalFile(customerFilePath, "text/xml"); returns PhysicalFileResult.

3. Methoden, die zu einem nicht leeren Antworttext in einem Inhaltstyp, der mit dem Client ausgehandelt wurde, formatieren3. Methods resulting in a non-empty response body formatted in a content type negotiated with the client

Diese Kategorie wird auch als Inhaltsaushandlung bezeichnet.This category is better known as Content Negotiation. Die Inhaltsaushandlung wird dann angewendet, wenn eine Aktion einen ObjectResult-Typ oder ein anderes Objekt, das keine IActionResult-Implementierung ist, zurückgibt.Content negotiation applies whenever an action returns an ObjectResult type or something other than an IActionResult implementation. Eine Aktion, die eine Implementierung zurückgibt, die nicht IActionResult ist (z.B. object), gibt auch eine formatierte Antwort zurück.An action that returns a non-IActionResult implementation (for example, object) also returns a Formatted Response.

Weitere Hilfsmethoden dieses Typs sind BadRequest, CreatedAtRoute und Ok.Some helper methods of this type include BadRequest, CreatedAtRoute, and Ok. return BadRequest(modelState);, return CreatedAtRoute("routename", values, newobject); und return Ok(value); sind Beispiele für diese Methoden.Examples of these methods include return BadRequest(modelState);, return CreatedAtRoute("routename", values, newobject);, and return Ok(value);, respectively. Beachten Sie, dass BadRequest und Ok Inhaltsaushandlungen nur dann durchführen, wenn ein Wert an sie übergeben wird. Wenn kein Wert übergeben wird, fungieren Sie als Ergebnistypen vom Typ HTTP-Statuscode.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. Andererseits führt die CreatedAtRoute-Methode immer Inhaltsaushandlungen durch, da ihre Überladungen alle das Übergeben eines Werts erfordern.The CreatedAtRoute method, on the other hand, always performs content negotiation since its overloads all require that a value be passed.

Übergreifende BelangeCross-Cutting Concerns

Verschiedene Anwendungen haben häufig übereinstimmende Teile in Ihrem Workflow.Applications typically share parts of their workflow. Beispiel dafür sind Anwendungen, die eine Authentifizierung erfordern, um auf den Einkaufswagen zugreifen zu können, oder Anwendungen, die Daten auf einigen Seiten zwischenspeichern.Examples include an app that requires authentication to access the shopping cart, or an app that caches data on some pages. Verwenden Sie einen Filter, um Logik vor oder nach einer Aktionsmethode durchzuführen.To perform logic before or after an action method, use a filter. Das Verwenden von Filtern bei übergreifenden Belangen kann Duplikate minimieren.Using Filters on cross-cutting concerns can reduce duplication.

Die meisten Filterattribute, wie z.B. [Authorize], können auf Ebene des Controllers oder der Aktion mit der gewünschten Detailgenauigkeit angewendet werden.Most filter attributes, such as [Authorize], can be applied at the controller or action level depending upon the desired level of granularity.

Die Fehlerbehandlung und das Zwischenspeichern von Antworten sind häufig übergreifende Belange:Error handling and response caching are often cross-cutting concerns:

Viele übergreifende Belange können mit Filtern oder mit benutzerdefinierter Middleware behandelt werden.Many cross-cutting concerns can be handled using filters or custom middleware.