Webframeworkk/ASP.NET Core/View Components: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „ == Einführung == In ASP.NET Core MVC ist eine '''Partial View''' (Teilansicht) ein wiederverwendbarer Block von Razor-Markup (.cshtml), der in andere Views eingebettet werden kann. Sie sind dafür konzipiert, spezifische UI-Elemente wie Listen, Formulare, Navigationsleisten oder Widgets zu kapseln. === Warum Partial Views verwenden? === * '''Wiederverwendbarkeit:''' Code einmal schreiben und in mehreren Views verwenden, was Duplikate und Inkonsistenzen…“ |
Keine Bearbeitungszusammenfassung |
||
| (Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt) | |||
| Zeile 3: | Zeile 3: | ||
=== | 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. | ||
* '''Wiederverwendbarkeit | |||
* ''' | == 1. Was sind View Components? == | ||
* ''' | 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. | ||
=== Hauptmerkmale === | |||
* '''Komplexität kapseln''': Gruppieren Sie zusammenhängende UI-Rendering-Logik in einer zusammenhängenden Einheit. | |||
* '''Wiederverwendbarkeit''': Verwenden Sie View Components in mehreren Ansichten, um Code-Duplizierung zu vermeiden. | |||
* '''Testbarkeit''': Aufgrund ihrer eigenständigen Natur leichter per Unit Test zu testen. | |||
* '''Rendering-Logik''': Ideal für dynamische Widgets, Navigationsmenüs, Login-Formulare, Warenkorb-Zusammenfassungen oder jedes UI-Element, das Datenabrufe oder Logik vor dem Rendern erfordert. | |||
=== Wann man View Components verwendet === | |||
* '''Komplexe UI-Elemente''': Wenn ein UI-Element komplexe Rendering-Logik erfordert. | |||
* '''Datengetriebene Elemente''': Wenn Sie Daten abrufen oder Berechnungen durchführen müssen, bevor gerendert wird. | |||
* '''Wiederverwendbare Widgets''': Wenn Sie ein wiederverwendbares Widget für verschiedene Teile Ihrer Anwendung erstellen möchten. | |||
---- | ---- | ||
== | == 2. Implementierungsschritte == | ||
Um eine View Component zu implementieren, folgen Sie im Allgemeinen diesen drei Schritten: | |||
# Erstellen einer View Component Klasse: Leiten Sie von <code>ViewComponent</code> ab. | |||
# Erstellen einer View: Erstellen Sie eine Razor-View-Datei (<code>.cshtml</code>). | |||
# Aufruf in Ihrer View: Verwenden Sie die Helper-Methode oder den Tag Helper. | |||
=== Schritt 1: Die View Component Klasse === | |||
Erstellen Sie eine Klasse, die von <code>ViewComponent</code> erbt. Sie sollte normalerweise in einem Ordner <code>ViewComponents</code> platziert werden. Die Klasse muss eine <code>Invoke</code> oder <code>InvokeAsync</code> Methode implementieren. | |||
'''Best Practice''': Benennen Sie die Klasse mit dem Suffix <code>ViewComponent</code> (z. B. <code>GridViewComponent</code>). | |||
= | <syntaxhighlight lang="csharp"> | ||
// GridViewComponent.cs | |||
using Microsoft.AspNetCore.Mvc; | |||
using System.Threading.Tasks; | |||
using System.Collections.Generic; | |||
public class GridViewComponent : ViewComponent | |||
{ | |||
public async Task<IViewComponentResult> InvokeAsync() | |||
{ | |||
// Daten kommen normalerweise aus einer Datenbank oder einem Service | |||
PersonGridModel model = new PersonGridModel() | |||
{ | |||
GridTitle = "Personenliste", | |||
Persons = new List<Person>() { | |||
new Person() { PersonName = "John", JobTitle = "Manager" }, | |||
// ... mehr Daten | |||
} | |||
}; | |||
// Gibt die View zurück (sucht nach Default.cshtml oder dem angegebenen View-Namen) | |||
return View("Sample", model); | |||
} | |||
} | |||
</syntaxhighlight> | |||
-- | === Schritt 2: Die View === | ||
Erstellen Sie eine Razor-View-Datei. Der Suchpfad für die View ist: | |||
<code>Views/Shared/Components/{ViewComponent Name}/{View Name}.cshtml</code> | |||
Für das obige Beispiel würde sich die Datei hier befinden: | |||
<code>Views/Shared/Components/Grid/Sample.cshtml</code> | |||
== | === Schritt 3: Aufrufen der View Component === | ||
Sie können | Sie können die Komponente in jeder Razor-View (z. B. <code>Index.cshtml</code>) mit <code>Component.InvokeAsync</code> oder einem Tag Helper aufrufen. | ||
<syntaxhighlight lang="html"> | |||
<!-- Standard-Syntax (Bevorzugt) --> | |||
@await Component.InvokeAsync("Grid") | |||
<!-- | |||
<!-- | <!-- Tag Helper Syntax --> | ||
< | <vc:grid></vc:grid> | ||
</syntaxhighlight> | |||
---- | |||
== | == 3. Stark typisierte View Components == | ||
Genau wie Standard-Views sollten View Components stark typisierte Modelle für Typsicherheit, IntelliSense und Wartbarkeit verwenden. | |||
=== Das View Model === | |||
Definieren Sie eine Klasse, um die Daten zu halten: | |||
<syntaxhighlight lang="csharp"> | |||
public class PersonGridModel | |||
{ | |||
public string GridTitle { get; set; } | |||
public List<Person> Persons { get; set; } | |||
} | |||
</syntaxhighlight> | |||
== | === Die Component View (<code>Sample.cshtml</code>) === | ||
Verwenden Sie die <code>@model</code> Direktive, um die View an die Klasse zu binden. | |||
= | <syntaxhighlight lang="html"> | ||
@model PersonGridModel | |||
<div class="box"> | |||
<h3>@Model.GridTitle</h3> | |||
<div class=" | <table class="table w-100"> | ||
<h3>@ | <thead> | ||
< | <tr> | ||
<th>Lfd. Nr.</th> | |||
<th>Name</th> | |||
</tr> | |||
</thead> | |||
</ | <tbody> | ||
@foreach (Person person in Model.Persons) | |||
{ | |||
<tr> | |||
<td>@person.PersonName</td> | |||
<td>@person.JobTitle</td> | |||
</tr> | |||
} | |||
</tbody> | |||
</table> | |||
</div> | </div> | ||
</ | </syntaxhighlight> | ||
---- | |||
== 4. Parameter übergeben == | |||
</ | Sie können Parameter an <code>InvokeAsync</code> übergeben, um die Ausgabe anzupassen. | ||
'''View Component Klasse:''' | |||
Aktualisieren Sie <code>InvokeAsync</code>, um Argumente zu akzeptieren. | |||
<syntaxhighlight lang="csharp"> | |||
< | public class GridViewComponent : ViewComponent | ||
{ | { | ||
public | public async Task<IViewComponentResult> InvokeAsync(PersonGridModel grid) | ||
{ | { | ||
return View("Sample", grid); | |||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
'''Aufruf mit Parametern:''' | |||
Übergeben Sie ein anonymes Objekt, bei dem die Eigenschaftsnamen mit den Parameternamen übereinstimmen. | |||
''' | |||
<syntaxhighlight lang="html"> | |||
@{ | @{ | ||
PersonGridModel myData = new PersonGridModel() { /* ... init ... */ }; | |||
} | } | ||
@await Component.InvokeAsync("Grid", new { grid = myData }) | |||
</syntaxhighlight> | |||
'''Tag Helper Syntax:''' | |||
< | <syntaxhighlight lang="html"> | ||
</ | <vc:grid grid="myData"></vc:grid> | ||
</syntaxhighlight> | |||
---- | ---- | ||
== Rückgabe | == 5. Rückgabe aus Controllern (ViewComponentResult) == | ||
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). | |||
<syntaxhighlight lang="csharp"> | |||
< | [Route("friends-list")] | ||
[Route(" | public IActionResult LoadFriendsList() | ||
public IActionResult | |||
{ | { | ||
PersonGridModel personGridModel = new PersonGridModel() | |||
{ | |||
GridTitle = "Freunde", | |||
Persons = new List<Person>() { /* ... */ } | |||
}; | }; | ||
// Gibt | // Gibt das View Component Result zurück | ||
return | return ViewComponent("Grid", new { grid = personGridModel }); | ||
} | } | ||
</ | </syntaxhighlight> | ||
---- | |||
< | == 6. Best Practices == | ||
* '''Benennung''': Klassennamen sollten mit <code>ViewComponent</code> enden. | |||
* '''Speicherort''': Detaillierte Ordnerstruktur (<code>Views/Shared/Components/...</code>). | |||
* '''Asynchron''': Verwenden Sie <code>InvokeAsync</code>, um blockierende Threads zu vermeiden. | |||
* '''Einfachheit''': Halten Sie Geschäftslogik aus der Komponente heraus; delegieren Sie an Services. | |||
* '''Typsicherheit''': Bevorzugen Sie immer stark typisierte Modelle gegenüber <code>ViewBag</code> oder <code>ViewData</code>. | |||
</ | |||
</ | |||
== | == 7. Dinge, die man vermeiden sollte == | ||
* '''Übermäßiger Gebrauch''': Verwenden Sie View Components nicht für einfache UI-Teile, die eine Partial View handhaben könnte. | |||
* '''Starke Kopplung''': Koppeln Sie Komponenten nicht an spezifische Controller. | |||
* '''Direkter Datenbankzugriff''': Verwenden Sie stattdessen Dependency Injection und Services. | |||
---- | ---- | ||
''Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).'' | ''Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).'' | ||
Aktuelle Version vom 18. Februar 2026, 20:36 Uhr
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
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.
1. Was sind View Components?
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.
Hauptmerkmale
- Komplexität kapseln: Gruppieren Sie zusammenhängende UI-Rendering-Logik in einer zusammenhängenden Einheit.
- Wiederverwendbarkeit: Verwenden Sie View Components in mehreren Ansichten, um Code-Duplizierung zu vermeiden.
- Testbarkeit: Aufgrund ihrer eigenständigen Natur leichter per Unit Test zu testen.
- Rendering-Logik: Ideal für dynamische Widgets, Navigationsmenüs, Login-Formulare, Warenkorb-Zusammenfassungen oder jedes UI-Element, das Datenabrufe oder Logik vor dem Rendern erfordert.
Wann man View Components verwendet
- Komplexe UI-Elemente: Wenn ein UI-Element komplexe Rendering-Logik erfordert.
- Datengetriebene Elemente: Wenn Sie Daten abrufen oder Berechnungen durchführen müssen, bevor gerendert wird.
- Wiederverwendbare Widgets: Wenn Sie ein wiederverwendbares Widget für verschiedene Teile Ihrer Anwendung erstellen möchten.
2. Implementierungsschritte
Um eine View Component zu implementieren, folgen Sie im Allgemeinen diesen drei Schritten:
- Erstellen einer View Component Klasse: Leiten Sie von
ViewComponentab. - Erstellen einer View: Erstellen Sie eine Razor-View-Datei (
.cshtml). - Aufruf in Ihrer View: Verwenden Sie die Helper-Methode oder den Tag Helper.
Schritt 1: Die View Component Klasse
Erstellen Sie eine Klasse, die von ViewComponent erbt. Sie sollte normalerweise in einem Ordner ViewComponents platziert werden. Die Klasse muss eine Invoke oder InvokeAsync Methode implementieren.
Best Practice: Benennen Sie die Klasse mit dem Suffix ViewComponent (z. B. GridViewComponent).
// GridViewComponent.cs
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using System.Collections.Generic;
public class GridViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync()
{
// Daten kommen normalerweise aus einer Datenbank oder einem Service
PersonGridModel model = new PersonGridModel()
{
GridTitle = "Personenliste",
Persons = new List<Person>() {
new Person() { PersonName = "John", JobTitle = "Manager" },
// ... mehr Daten
}
};
// Gibt die View zurück (sucht nach Default.cshtml oder dem angegebenen View-Namen)
return View("Sample", model);
}
}
Schritt 2: Die View
Erstellen Sie eine Razor-View-Datei. Der Suchpfad für die View ist:
Views/Shared/Components/{ViewComponent Name}/{View Name}.cshtml
Für das obige Beispiel würde sich die Datei hier befinden:
Views/Shared/Components/Grid/Sample.cshtml
Schritt 3: Aufrufen der View Component
Sie können die Komponente in jeder Razor-View (z. B. Index.cshtml) mit Component.InvokeAsync oder einem Tag Helper aufrufen.
<!-- Standard-Syntax (Bevorzugt) -->
@await Component.InvokeAsync("Grid")
<!-- Tag Helper Syntax -->
<vc:grid></vc:grid>
3. Stark typisierte View Components
Genau wie Standard-Views sollten View Components stark typisierte Modelle für Typsicherheit, IntelliSense und Wartbarkeit verwenden.
Das View Model
Definieren Sie eine Klasse, um die Daten zu halten:
public class PersonGridModel
{
public string GridTitle { get; set; }
public List<Person> Persons { get; set; }
}
Die Component View (Sample.cshtml)
Verwenden Sie die @model Direktive, um die View an die Klasse zu binden.
@model PersonGridModel
<div class="box">
<h3>@Model.GridTitle</h3>
<table class="table w-100">
<thead>
<tr>
<th>Lfd. Nr.</th>
<th>Name</th>
</tr>
</thead>
<tbody>
@foreach (Person person in Model.Persons)
{
<tr>
<td>@person.PersonName</td>
<td>@person.JobTitle</td>
</tr>
}
</tbody>
</table>
</div>
4. Parameter übergeben
Sie können Parameter an InvokeAsync übergeben, um die Ausgabe anzupassen.
View Component Klasse:
Aktualisieren Sie InvokeAsync, um Argumente zu akzeptieren.
public class GridViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync(PersonGridModel grid)
{
return View("Sample", grid);
}
}
Aufruf mit Parametern: Übergeben Sie ein anonymes Objekt, bei dem die Eigenschaftsnamen mit den Parameternamen übereinstimmen.
@{
PersonGridModel myData = new PersonGridModel() { /* ... init ... */ };
}
@await Component.InvokeAsync("Grid", new { grid = myData })
Tag Helper Syntax:
<vc:grid grid="myData"></vc:grid>
5. Rückgabe aus Controllern (ViewComponentResult)
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).
[Route("friends-list")]
public IActionResult LoadFriendsList()
{
PersonGridModel personGridModel = new PersonGridModel()
{
GridTitle = "Freunde",
Persons = new List<Person>() { /* ... */ }
};
// Gibt das View Component Result zurück
return ViewComponent("Grid", new { grid = personGridModel });
}
6. Best Practices
- Benennung: Klassennamen sollten mit
ViewComponentenden. - Speicherort: Detaillierte Ordnerstruktur (
Views/Shared/Components/...). - Asynchron: Verwenden Sie
InvokeAsync, um blockierende Threads zu vermeiden. - Einfachheit: Halten Sie Geschäftslogik aus der Komponente heraus; delegieren Sie an Services.
- Typsicherheit: Bevorzugen Sie immer stark typisierte Modelle gegenüber
ViewBagoderViewData.
7. Dinge, die man vermeiden sollte
- Übermäßiger Gebrauch: Verwenden Sie View Components nicht für einfache UI-Teile, die eine Partial View handhaben könnte.
- Starke Kopplung: Koppeln Sie Komponenten nicht an spezifische Controller.
- Direkter Datenbankzugriff: Verwenden Sie stattdessen Dependency Injection und Services.
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).