Übersicht über ASP.NET Core MVCOverview of ASP.NET Core MVC

Von Steve SmithBy Steve Smith

ASP.NET Core MVC ist ein umfangreiches Framework zum Erstellen von Web-Apps und APIs mithilfe des Model-View-Controller-Entwurfsmusters.ASP.NET Core MVC is a rich framework for building web apps and APIs using the Model-View-Controller design pattern.

Was ist das MVC-Muster?What is the MVC pattern?

Das Architekturmuster Model-View-Controller (MVC) unterteilt eine Anwendung in drei Hauptkomponentengruppen: Modelle (Models), Ansichten (Views) und Controller (Controllers).The Model-View-Controller (MVC) architectural pattern separates an application into three main groups of components: Models, Views, and Controllers. Dieses Muster erleichtert die Trennung von Belangen.This pattern helps to achieve separation of concerns. Mit diesem Muster werden Benutzeranforderungen an einen Controller weitergeleitet. Der Controller arbeitet mit dem Modell, um Benutzeraktionen auszuführen und/oder Ergebnisse von Abfragen abzurufen.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. Der Controller wählt die Ansicht, die dem Benutzer angezeigt wird, und stellt sämtliche erforderliche Modelldaten dafür bereit.The Controller chooses the View to display to the user, and provides it with any Model data it requires.

Die folgende Abbildung zeigt die drei Hauptkomponenten und deren Beziehungen untereinander:The following diagram shows the three main components and which ones reference the others:

MVC-Muster

Diese Abgrenzung der Aufgaben erleichtert die Skalierung Ihrer Anwendung hinsichtlich der Komplexität, da es einfacher ist, ein Element zu codieren, zu debuggen und zu testen (das Modell, die Ansicht oder den Controller), das nur eine einzige Aufgabe hat.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. Deutlich schwieriger ist es, Code zu aktualisieren, zu testen und zu debuggen, der Abhängigkeiten in zwei oder drei dieser Bereiche aufweist.It's more difficult to update, test, and debug code that has dependencies spread across two or more of these three areas. Benutzeroberflächenlogik ändert sich beispielsweise häufiger als Geschäftslogik.For example, user interface logic tends to change more frequently than business logic. Werden Präsentationscode und Geschäftslogik in einem einzigen Objekt kombiniert, muss ein Objekt mit Geschäftslogik jedes Mal geändert werden, wenn die Benutzeroberfläche geändert wird.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. Dies führt häufig zu Fehlermeldungen. Außerdem muss die Geschäftslogik nach jeder kleinen Änderung der Benutzeroberfläche erneut getestet werden.This often introduces errors and requires the retesting of business logic after every minimal user interface change.

Hinweis

Sowohl die Ansicht als auch der Controller sind abhängig vom Modell.Both the view and the controller depend on the model. Das Modell ist jedoch weder von der Ansicht noch vom Controller abhängig.However, the model depends on neither the view nor the controller. Hierin besteht einer der Hauptvorteile der Trennung.This is one of the key benefits of the separation. Aufgrund dieser Trennung kann das Modell unabhängig von der visuellen Darstellung erstellt und getestet werden.This separation allows the model to be built and tested independent of the visual presentation.

Aufgaben des ModellsModel Responsibilities

Das Modell stellt in einer MVC-Anwendung den Status der Anwendung und sämtlicher Vorgänge oder Geschäftslogik dar, die von ihm ausgeführt werden sollen.The Model in an MVC application represents the state of the application and any business logic or operations that should be performed by it. Im Modell sollte Geschäftslogik zusammen mit der gesamten Implementierungslogik gekapselt werden, um den Status der Anwendung beizubehalten.Business logic should be encapsulated in the model, along with any implementation logic for persisting the state of the application. Stark typisierte Ansichten verwenden in der Regel ViewModel-Typen, die die Daten für diese Ansicht enthalten.Strongly-typed views typically use ViewModel types designed to contain the data to display on that view. Der Controller erstellt und füllt diese ViewModel-Instanzen aus dem Modell.The controller creates and populates these ViewModel instances from the model.

Aufgaben der AnsichtView Responsibilities

Ansichten dienen der Darstellung von Inhalt über die Benutzeroberfläche.Views are responsible for presenting content through the user interface. Sie verwenden die Razor Ansichts-Engine zum Einbetten von .NET-Code in HTML-Markup.They use the Razor view engine to embed .NET code in HTML markup. Ansichten sollten so wenig Logik wie möglich enthalten. Die enthaltene Logik sollte sich zudem auf die Darstellung von Inhalt beziehen.There should be minimal logic within views, and any logic in them should relate to presenting content. Sollten Sie dennoch viel Logik in Ansichtsdateien ausführen müssen, um Daten aus einem komplexen Modell anzuzeigen, ist es sinnvoll, eine Ansichtskomponente, ViewModel oder eine Ansichtsvorlage zu verwenden, um die Ansicht zu vereinfachen.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.

Aufgaben des ControllersController Responsibilities

Controller sind Komponenten, die Benutzerinteraktionen verarbeiten, mit dem Modell arbeiten und letztlich eine Ansicht auswählen, die gerendert werden soll.Controllers are the components that handle user interaction, work with the model, and ultimately select a view to render. In einer MVC-Anwendung zeigt die Ansicht nur Informationen an. Benutzereingaben und -interaktionen werden vom Controller verarbeitet und beantwortet.In an MVC application, the view only displays information; the controller handles and responds to user input and interaction. Im MVC-Muster stellt der Controller den Einstiegspunkt dar. Er ist verantwortlich für die Auswahl des Modells, mit dem gearbeitet wird, sowie der Ansicht, die gerendert wird (daher kommt auch sein Name: Der Controller kontrolliert, wie die App auf eine bestimmte Anforderung reagiert).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).

Hinweis

Controller sollten nicht durch zu viele Aufgaben übermäßig kompliziert gemacht werden.Controllers shouldn't be overly complicated by too many responsibilities. Um zu verhindern, dass die Controllerlogik zu komplex wird, verlagern Sie die Geschäftslogik aus dem Controller in das Domänenmodell.To keep controller logic from becoming overly complex, push business logic out of the controller and into the domain model.

Tipp

Wenn Sie feststellen, dass Ihre Controlleraktionen häufig die gleiche Art von Aktionen ausführen, verschieben diese häufig ausgeführten Aktionen in Filter.If you find that your controller actions frequently perform the same kinds of actions, move these common actions into filters.

Was ist ASP.NET Core MVC?What is ASP.NET Core MVC

Das ASP.NET Core MVC-Framework ist ein einfaches, äußerst testfähiges Open-Source-Präsentationsframework, das für die Verwendung mit ASP.NET Core optimiert wurde.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 stellt eine auf Mustern basierte Methode zum Entwickeln dynamischer Websites dar, die eine saubere Trennung von Belangen ermöglicht.ASP.NET Core MVC provides a patterns-based way to build dynamic websites that enables a clean separation of concerns. Es ermöglicht Ihnen die vollständige Kontrolle über das Markup, unterstützt eine TDD-freundliche Entwicklung und verwendet die aktuellsten Webstandards.It gives you full control over markup, supports TDD-friendly development and uses the latest web standards.

FeaturesFeatures

Zu ASP.NET Core MVC gehören folgende Elemente:ASP.NET Core MVC includes the following:

RoutingRouting

ASP.NET Core MVC baut auf dem Routing von ASP.NET Core auf, einer leistungsstarken URL-Zuordnungskomponente, mit der Sie Anwendungen mit verständlichen und suchbaren URLs erstellen können.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. Damit können Sie die URL-Benennungsmuster für Ihre Anwendung definieren, die sich für die Suchmaschinenoptimierung (SEO) und die Linkgenerierung eignen, ohne dass die Organisation der Dateien auf Ihrem Webserver berücksichtigt werden muss.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. Sie können die Routen mithilfe einer geeigneten Syntax für Routenvorlagen definieren, die Routenwerteinschränkungen, Standardwerte sowie optionale Werte unterstützt.You can define your routes using a convenient route template syntax that supports route value constraints, defaults and optional values.

Mit dem auf Konventionen basierten Routing können Sie global definieren, welche URL-Formate Ihre Anwendung akzeptiert, und wie diese Formate einer bestimmten Aktionsmethode auf dem angegebenen Controller zugeordnet werden.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. Wird eine eingehende Anforderung empfangen, analysiert die Routingengine die URL und vergleicht sie mit einer der definierten URL-Formate. Anschließend wird die zugeordnete Aktionsmethode des Controllers aufgerufen.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?}");

Attributrouting ermöglicht Ihnen die Angabe von Routinginformationen, indem die Controller und Aktionen mit Attributen versehen werden, die die Routen für Ihre Anwendung definieren.Attribute routing enables you to specify routing information by decorating your controllers and actions with attributes that define your application's routes. Das bedeutet, dass Ihre Routendefinitionen neben den Controller und die Aktion platziert werden, denen sie zugeordnet sind.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)
    {
      ...
    }
}

ModellbindungModel binding

Die Modellbindung von ASP.NET Core MVC konvertiert Clientanforderungsdaten (Formularwerte, Routendaten, Abfragezeichenfolgen-Parameter, HTTP-Header) in Objekte, die der Controller verarbeiten kann.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. Dadurch muss Ihre Controllerlogik nicht mehr die eingehenden Anforderungsdaten ermitteln. Die Daten sind bereits als Parameter für die Aktionsmethoden vorhanden.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) { ... }

ModellvalidierungModel validation

ASP.NET Core MVC unterstützt die Validierung, indem das Modellobjekt mit Validierungsattributen für Datenanmerkungen versehen wird.ASP.NET Core MVC supports validation by decorating your model object with data annotation validation attributes. Die Validierungsattribute werden auf der Clientseite überprüft, bevor Werte auf dem Server bereitgestellt werden. Auf der Serverseite werden sie überprüft, bevor die Controlleraktion aufgerufen wird.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; }
}

Eine Controlleraktion: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);
}

Das Framework verarbeitet Validierungsanforderungsdaten sowohl auf dem Client als auch auf dem Server.The framework handles validating request data both on the client and on the server. Für Modelltypen angegebene Validierungslogik wird den gerenderten Ansichten als unaufdringliche Anmerkungen hinzugefügt und im Browser mit jQuery Validation erzwungen.Validation logic specified on model types is added to the rendered views as unobtrusive annotations and is enforced in the browser with jQuery Validation.

AbhängigkeitsinjektionDependency injection

ASP.NET Core verfügt über integrierte Unterstützung für Dependency Injection ( DI).ASP.NET Core has built-in support for dependency injection (DI). In ASP.NET Core MVC können Controller benötigte Dienste über ihre Konstruktoren anfordern. So wird das Prinzip der expliziten Abhängigkeiten befolgt.In ASP.NET Core MVC, controllers can request needed services through their constructors, allowing them to follow the Explicit Dependencies Principle.

Mit der @inject-Anweisung kann Ihre App Dependency Injection auch in Ansichtsdateien verwenden: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>

FilterFilters

Mit Filtern können Entwickler übergreifende Belange kapseln, wie etwa die Ausnahmebehandlung oder die Autorisierung.Filters help developers encapsulate cross-cutting concerns, like exception handling or authorization. Filter ermöglichen das Ausführen benutzerdefinierter Vor- und Nachverarbeitungslogik für Aktionsmethoden. Sie können so konfiguriert werden, dass sie für eine angegebene Anforderung an bestimmten Stellen in der Ausführungspipeline ausgeführt werden.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. Filter können als Attribute auf Controller oder Aktionen angewendet werden (oder sie werden global ausgeführt).Filters can be applied to controllers or actions as attributes (or can be run globally). Das Framework enthält mehrere Filter (wie z.B. Authorize).Several filters (such as Authorize) are included in the framework. [Authorize] ist das Attribut, das zum Erstellen von MVC-Autorisierungsfiltern verwendet wird.[Authorize] is the attribute that is used to create MVC authorization filters.

[Authorize]
public class AccountController : Controller

BereicheAreas

Bereiche bieten eine Möglichkeit, eine große ASP.net Core MVC-Web-App in kleinere funktionale Gruppierungen zu partitionieren.Areas provide a way to partition a large ASP.NET Core MVC Web app into smaller functional groupings. Ein Bereich ist eine MVC-Struktur innerhalb einer Anwendung.An area is an MVC structure inside an application. In einem MVC-Projekt sind logische Komponenten wie Modell, Controller und Ansicht in verschiedenen Ordnern gespeichert. MVC nutzt Namenskonventionen zum Erstellen einer Beziehung zwischen diesen Komponenten.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. Bei einer großen App kann es von Vorteil sein, die App in mehrere Bereiche mit hoher Funktionalität aufzuteilen.For a large app, it may be advantageous to partition the app into separate high level areas of functionality. Beispielsweise eine e-Commerce-App mit mehreren Geschäftseinheiten, z. b. Checkout, Abrechnung und Suche usw. Jede dieser Einheiten verfügt über eigene logische Komponenten Sichten, Controller und Modelle.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.

Web-APIsWeb APIs

Als umfangreiche Plattform zum Erstellen von Websites verfügt ASP.NET Core MVC außerdem über umfassende Unterstützung für das Erstellen von Web-APIs.In addition to being a great platform for building web sites, ASP.NET Core MVC has great support for building Web APIs. Sie können Dienste für eine breit gefächerte Palette von Clients erstellen, darunter auch Browser und mobile Geräte.You can build services that reach a broad range of clients including browsers and mobile devices.

Das Framework beinhaltet Unterstützung für die Aushandlung von HTTP-Inhalt mit integrierter Unterstützung zum Formatieren von Daten als JSON oder XML.The framework includes support for HTTP content-negotiation with built-in support to format data as JSON or XML. Sie können benutzerdefinierte Formatierungsprogramme schreiben, um Unterstützung für Ihre eigenen Formate hinzuzufügen.Write custom formatters to add support for your own formats.

Außerdem können Sie mit der Linkgenerierung Unterstützung für Hypermedia aktivieren.Use link generation to enable support for hypermedia. Aktivieren Sie auf einfache Weise Unterstützung für die Ressourcenfreigabe zwischen verschiedenen Ursprüngen (CORS), damit Ihre Web-APIs für mehrere Webanwendungen freigegeben werden.Easily enable support for cross-origin resource sharing (CORS) so that your Web APIs can be shared across multiple Web applications.

PrüfbarkeitTestability

Durch die Verwendung von Schnittstellen und der Abhängigkeitsinjektion eignet sich das Framework besonders gut für Komponententests. Es enthält Features (wie etwa einen TestHost- und InMemory-Anbieter für Entity Framework), mit denen auch Integrationstests schnell und einfach durchgeführt werden können.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. Weitere Informationen hierzu finden Sie unter Testen der Controllerlogik.Learn more about how to test controller logic.

RazorAnzeige-Engine view engine

ASP.net Core MVC-Ansichten verwenden Sie die Razor Ansichts-Engine zum renderingansichten.ASP.NET Core MVC views use the Razor view engine to render views. Razorist eine kompakte, ausdrucksstarke und fließende Vorlagen Markup Sprache zum Definieren von Sichten mithilfe von eingebettetem c#-Code. is a compact, expressive and fluid template markup language for defining views using embedded C# code. Razorwird verwendet, um Webinhalte auf dem Server dynamisch zu generieren. is used to dynamically generate web content on the server. Sie können Servercode sauber mit Inhalt und Code der Clientseite kombinieren.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>

Mithilfe der Razor Ansichts-Engine können Sie Layouts, Teilansichten und austauschbare Abschnitte definieren.Using the Razor view engine you can define layouts, partial views and replaceable sections.

Stark typisierte AnsichtenStrongly typed views

RazorSichten in MVC können basierend auf dem Modell stark typisiert werden. views in MVC can be strongly typed based on your model. Controller können ein stark typisiertes Modell an die Ansichten übergeben, um Typüberprüfung und IntelliSense-Unterstützung für Ihre Ansichten zu aktivieren.Controllers can pass a strongly typed model to views enabling your views to have type checking and IntelliSense support.

Die folgende Ansicht rendert beispielweise ein Modell vom Typ 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>

TaghilfsprogrammeTag Helpers

Taghilfsprogramme ermöglichen es dem serverseitigen Code, an der Erstellung und dem Rendern von HTML-Elementen in Razor Dateien teilzunehmen.Tag Helpers enable server side code to participate in creating and rendering HTML elements in Razor files. Mit Taghilfsprogrammen können Sie benutzerdefinierte Tags anpassen (z.B. <environment>) oder das Verhalten von vorhandenen Tags ändern (z.B. <label>).You can use tag helpers to define custom tags (for example, <environment>) or to modify the behavior of existing tags (for example, <label>). Taghilfsprogramme sind an bestimmte Elemente basierend auf dem Elementnamen und dessen Attributen gebunden.Tag Helpers bind to specific elements based on the element name and its attributes. Sie bieten gleichzeitig die Vorteile des serverseitigen Renderns sowie der HTML-Bearbeitungsmöglichkeiten.They provide the benefits of server-side rendering while still preserving an HTML editing experience.

Für häufige Aufgaben wie das Erstellen von Formularen und Links sowie das Laden von Objekten gibt es zahlreiche integrierte Taghilfsprogramme. Weitere Taghilfsprogramme sind in öffentlichen GitHub-Repositorys und als NuGet-Pakete verfügbar.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. Taghilfsprogramme werden in C# erstellt und sind für HTML-Elemente basierend auf dem Elementnamen, dem Attributnamen oder dem übergeordneten Tag konzipiert.Tag Helpers are authored in C#, and they target HTML elements based on element name, attribute name, or parent tag. Der integrierte LinkTagHelper kann z.B. verwendet werden, um einen Link zur Login-Aktion des AccountsController zu erstellen: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>

Mit EnvironmentTagHelper können Sie Ihren Ansichten verschiedene Skripts hinzufügen (z.B. minimiert oder RAW), basierend auf der Laufzeitumgebung, wie Entwicklung, Staging oder Produktion: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>

Taghilfsprogramme bieten eine HTML-freundliche Entwicklungsumgebung und eine umfangreiche IntelliSense-Umgebung zum Erstellen von HTML und Razor Markup.Tag Helpers provide an HTML-friendly development experience and a rich IntelliSense environment for creating HTML and Razor markup. Die meisten integrierten Taghilfsprogramme sind für vorhandene HTML-Elemente konzipiert und stellen serverseitige Attribute für die jeweiligen Elemente bereit.Most of the built-in Tag Helpers target existing HTML elements and provide server-side attributes for the element.

AnsichtskomponentenView Components

Mit Ansichtskomponenten können Sie Renderinglogik packen und in der gesamten Anwendung wiederverwenden.View Components allow you to package rendering logic and reuse it throughout the application. Ansichtskomponenten ähneln Teilansichten, enthalten jedoch zugeordnete Logik.They're similar to partial views, but with associated logic.

KompatibilitätsversionCompatibility version

Durch die Methode SetCompatibilityVersion kann eine App Änderungen im Verhalten annehmen oder ablehnen, die in ASP.NET Core MVC 2.1 und höher eingeführt werden und potentiell Fehler verursachen.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.

Weitere Informationen finden Sie unter Kompatibilitätsversion für ASP.NET Core MVC.For more information, see Kompatibilitätsversion für ASP.NET Core MVC.

Zusätzliche RessourcenAdditional resources