<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mediawiki.wissen-ahrensburg.de/index.php?action=history&amp;feed=atom&amp;title=Webframeworkk%2FASP.NET_Core%2FView_Components</id>
	<title>Webframeworkk/ASP.NET Core/View Components - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.wissen-ahrensburg.de/index.php?action=history&amp;feed=atom&amp;title=Webframeworkk%2FASP.NET_Core%2FView_Components"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Webframeworkk/ASP.NET_Core/View_Components&amp;action=history"/>
	<updated>2026-08-19T16:51:24Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Dokument</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Webframeworkk/ASP.NET_Core/View_Components&amp;diff=263&amp;oldid=prev</id>
		<title>imported&gt;Import: Version 188</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Webframeworkk/ASP.NET_Core/View_Components&amp;diff=263&amp;oldid=prev"/>
		<updated>2026-02-18T20:36:13Z</updated>

		<summary type="html">&lt;p&gt;Version 188&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&amp;#039;&amp;#039;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dieses Tutorial erklärt, was View Components in ASP.NET Core sind, wann man sie verwendet und wie man sie effektiv implementiert. Es deckt Standard-View Components, stark typisierte Implementierungen, die Übergabe von Parametern und die Rückgabe aus Controllern ab.&lt;br /&gt;
&lt;br /&gt;
== 1. Was sind View Components? ==&lt;br /&gt;
&lt;br /&gt;
View Components (Ansichtskomponenten) sind eigenständige, wiederverwendbare UI-Bausteine in ASP.NET Core MVC. Sie sind dafür konzipiert, Rendering-Logik zu kapseln, die komplexer ist als das, was man typischerweise in eine Partial View (Teilansicht) packen würde, aber nicht die Komplexität eines vollwertigen Controllers rechtfertigt.&lt;br /&gt;
&lt;br /&gt;
=== Hauptmerkmale ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Komplexität kapseln&amp;#039;&amp;#039;&amp;#039;: Gruppieren Sie zusammenhängende UI-Rendering-Logik in einer zusammenhängenden Einheit.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Wiederverwendbarkeit&amp;#039;&amp;#039;&amp;#039;: Verwenden Sie View Components in mehreren Ansichten, um Code-Duplizierung zu vermeiden.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Testbarkeit&amp;#039;&amp;#039;&amp;#039;: Aufgrund ihrer eigenständigen Natur leichter per Unit Test zu testen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Rendering-Logik&amp;#039;&amp;#039;&amp;#039;: Ideal für dynamische Widgets, Navigationsmenüs, Login-Formulare, Warenkorb-Zusammenfassungen oder jedes UI-Element, das Datenabrufe oder Logik vor dem Rendern erfordert.&lt;br /&gt;
&lt;br /&gt;
=== Wann man View Components verwendet ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Komplexe UI-Elemente&amp;#039;&amp;#039;&amp;#039;: Wenn ein UI-Element komplexe Rendering-Logik erfordert.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Datengetriebene Elemente&amp;#039;&amp;#039;&amp;#039;: Wenn Sie Daten abrufen oder Berechnungen durchführen müssen, bevor gerendert wird.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Wiederverwendbare Widgets&amp;#039;&amp;#039;&amp;#039;: Wenn Sie ein wiederverwendbares Widget für verschiedene Teile Ihrer Anwendung erstellen möchten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== 2. Implementierungsschritte ==&lt;br /&gt;
&lt;br /&gt;
Um eine View Component zu implementieren, folgen Sie im Allgemeinen diesen drei Schritten:&lt;br /&gt;
&lt;br /&gt;
# Erstellen einer View Component Klasse: Leiten Sie von &amp;lt;code&amp;gt;ViewComponent&amp;lt;/code&amp;gt; ab.&lt;br /&gt;
# Erstellen einer View: Erstellen Sie eine Razor-View-Datei (&amp;lt;code&amp;gt;.cshtml&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Aufruf in Ihrer View: Verwenden Sie die Helper-Methode oder den Tag Helper.&lt;br /&gt;
&lt;br /&gt;
=== Schritt 1: Die View Component Klasse ===&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine Klasse, die von &amp;lt;code&amp;gt;ViewComponent&amp;lt;/code&amp;gt; erbt. Sie sollte normalerweise in einem Ordner &amp;lt;code&amp;gt;ViewComponents&amp;lt;/code&amp;gt; platziert werden. Die Klasse muss eine &amp;lt;code&amp;gt;Invoke&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;InvokeAsync&amp;lt;/code&amp;gt; Methode implementieren.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Best Practice&amp;#039;&amp;#039;&amp;#039;: Benennen Sie die Klasse mit dem Suffix &amp;lt;code&amp;gt;ViewComponent&amp;lt;/code&amp;gt; (z. B. &amp;lt;code&amp;gt;GridViewComponent&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;// GridViewComponent.cs&lt;br /&gt;
using Microsoft.AspNetCore.Mvc;&lt;br /&gt;
using System.Threading.Tasks;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
public class GridViewComponent : ViewComponent&lt;br /&gt;
{&lt;br /&gt;
    public async Task&amp;lt;IViewComponentResult&amp;gt; InvokeAsync() &lt;br /&gt;
    {&lt;br /&gt;
        // Daten kommen normalerweise aus einer Datenbank oder einem Service&lt;br /&gt;
        PersonGridModel model = new PersonGridModel()&lt;br /&gt;
        {&lt;br /&gt;
            GridTitle = &amp;quot;Personenliste&amp;quot;,&lt;br /&gt;
            Persons = new List&amp;lt;Person&amp;gt;() {&lt;br /&gt;
                new Person() { PersonName = &amp;quot;John&amp;quot;, JobTitle = &amp;quot;Manager&amp;quot; },&lt;br /&gt;
                // ... mehr Daten&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
        // Gibt die View zurück (sucht nach Default.cshtml oder dem angegebenen View-Namen)&lt;br /&gt;
        return View(&amp;quot;Sample&amp;quot;, model); &lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Schritt 2: Die View ===&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine Razor-View-Datei. Der Suchpfad für die View ist: &amp;lt;code&amp;gt;Views/Shared/Components/{ViewComponent Name}/{View Name}.cshtml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für das obige Beispiel würde sich die Datei hier befinden: &amp;lt;code&amp;gt;Views/Shared/Components/Grid/Sample.cshtml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schritt 3: Aufrufen der View Component ===&lt;br /&gt;
&lt;br /&gt;
Sie können die Komponente in jeder Razor-View (z. B. &amp;lt;code&amp;gt;Index.cshtml&amp;lt;/code&amp;gt;) mit &amp;lt;code&amp;gt;Component.InvokeAsync&amp;lt;/code&amp;gt; oder einem Tag Helper aufrufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Standard-Syntax (Bevorzugt) --&amp;gt;&lt;br /&gt;
@await Component.InvokeAsync(&amp;quot;Grid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Tag Helper Syntax --&amp;gt;&lt;br /&gt;
&amp;lt;vc:grid&amp;gt;&amp;lt;/vc:grid&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== 3. Stark typisierte View Components ==&lt;br /&gt;
&lt;br /&gt;
Genau wie Standard-Views sollten View Components stark typisierte Modelle für Typsicherheit, IntelliSense und Wartbarkeit verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Das View Model ===&lt;br /&gt;
&lt;br /&gt;
Definieren Sie eine Klasse, um die Daten zu halten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;public class PersonGridModel&lt;br /&gt;
{&lt;br /&gt;
    public string GridTitle { get; set; }&lt;br /&gt;
    public List&amp;lt;Person&amp;gt; Persons { get; set; }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Die Component View (&amp;lt;code&amp;gt;Sample.cshtml&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie die &amp;lt;code&amp;gt;@model&amp;lt;/code&amp;gt; Direktive, um die View an die Klasse zu binden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;@model PersonGridModel &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;@Model.GridTitle&amp;lt;/h3&amp;gt; &lt;br /&gt;
    &amp;lt;table class=&amp;quot;table w-100&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
            &amp;lt;tr&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;Lfd. Nr.&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
        &amp;lt;tbody&amp;gt;&lt;br /&gt;
            @foreach (Person person in Model.Persons)&lt;br /&gt;
            {&lt;br /&gt;
                &amp;lt;tr&amp;gt;&lt;br /&gt;
                    &amp;lt;td&amp;gt;@person.PersonName&amp;lt;/td&amp;gt;&lt;br /&gt;
                    &amp;lt;td&amp;gt;@person.JobTitle&amp;lt;/td&amp;gt;&lt;br /&gt;
                &amp;lt;/tr&amp;gt;&lt;br /&gt;
            }&lt;br /&gt;
        &amp;lt;/tbody&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== 4. Parameter übergeben ==&lt;br /&gt;
&lt;br /&gt;
Sie können Parameter an &amp;lt;code&amp;gt;InvokeAsync&amp;lt;/code&amp;gt; übergeben, um die Ausgabe anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;View Component Klasse:&amp;#039;&amp;#039;&amp;#039; Aktualisieren Sie &amp;lt;code&amp;gt;InvokeAsync&amp;lt;/code&amp;gt;, um Argumente zu akzeptieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;public class GridViewComponent : ViewComponent&lt;br /&gt;
{&lt;br /&gt;
    public async Task&amp;lt;IViewComponentResult&amp;gt; InvokeAsync(PersonGridModel grid)  &lt;br /&gt;
    {&lt;br /&gt;
        return View(&amp;quot;Sample&amp;quot;, grid);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Aufruf mit Parametern:&amp;#039;&amp;#039;&amp;#039; Übergeben Sie ein anonymes Objekt, bei dem die Eigenschaftsnamen mit den Parameternamen übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;@{&lt;br /&gt;
    PersonGridModel myData = new PersonGridModel() { /* ... init ... */ };&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
@await Component.InvokeAsync(&amp;quot;Grid&amp;quot;, new { grid = myData }) &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tag Helper Syntax:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;vc:grid grid=&amp;quot;myData&amp;quot;&amp;gt;&amp;lt;/vc:grid&amp;gt; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== 5. Rückgabe aus Controllern (ViewComponentResult) ==&lt;br /&gt;
&lt;br /&gt;
Sie können eine View Component direkt aus einer Controller-Action zurückgeben. Dies ist nützlich für API-ähnliche Endpunkte, die HTML-Fragmente zurückgeben (z. B. für AJAX-Updates).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;[Route(&amp;quot;friends-list&amp;quot;)]&lt;br /&gt;
public IActionResult LoadFriendsList()&lt;br /&gt;
{&lt;br /&gt;
    PersonGridModel personGridModel = new PersonGridModel()&lt;br /&gt;
    {&lt;br /&gt;
        GridTitle = &amp;quot;Freunde&amp;quot;,&lt;br /&gt;
        Persons = new List&amp;lt;Person&amp;gt;() { /* ... */ }&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    // Gibt das View Component Result zurück&lt;br /&gt;
    return ViewComponent(&amp;quot;Grid&amp;quot;, new { grid = personGridModel });&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== 6. Best Practices ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Benennung&amp;#039;&amp;#039;&amp;#039;: Klassennamen sollten mit &amp;lt;code&amp;gt;ViewComponent&amp;lt;/code&amp;gt; enden.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speicherort&amp;#039;&amp;#039;&amp;#039;: Detaillierte Ordnerstruktur (&amp;lt;code&amp;gt;Views/Shared/Components/...&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Asynchron&amp;#039;&amp;#039;&amp;#039;: Verwenden Sie &amp;lt;code&amp;gt;InvokeAsync&amp;lt;/code&amp;gt;, um blockierende Threads zu vermeiden.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Einfachheit&amp;#039;&amp;#039;&amp;#039;: Halten Sie Geschäftslogik aus der Komponente heraus; delegieren Sie an Services.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Typsicherheit&amp;#039;&amp;#039;&amp;#039;: Bevorzugen Sie immer stark typisierte Modelle gegenüber &amp;lt;code&amp;gt;ViewBag&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;ViewData&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. Dinge, die man vermeiden sollte ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Übermäßiger Gebrauch&amp;#039;&amp;#039;&amp;#039;: Verwenden Sie View Components nicht für einfache UI-Teile, die eine Partial View handhaben könnte.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Starke Kopplung&amp;#039;&amp;#039;&amp;#039;: Koppeln Sie Komponenten nicht an spezifische Controller.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Direkter Datenbankzugriff&amp;#039;&amp;#039;&amp;#039;: Verwenden Sie stattdessen Dependency Injection und Services.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>imported&gt;Import</name></author>
	</entry>
</feed>