Kurse:View Components

Aus ahrensburg.city
Version vom 29. Juni 2025, 19:33 Uhr von Thorsten (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „= View Components in ASP.NET Core MVC (Deutsch) = == Einführung == View Components sind wiederverwendbare, selbstständige UI-Bausteine in ASP.NET Core MVC. Sie sind stärker als Partial Views und leichter als vollständige Controller + Views. == Zweck == * '''Komplexität kapseln''': UI-Logik in einer Einheit bündeln * '''Wiederverwendbarkeit''': In mehreren Views einsetzen * '''Testbarkeit''': Einfach zu testen durch Entkopplung * '''Einsatz''': Dyn…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

View Components in ASP.NET Core MVC (Deutsch)

Einführung

View Components sind wiederverwendbare, selbstständige UI-Bausteine in ASP.NET Core MVC. Sie sind stärker als Partial Views und leichter als vollständige Controller + Views.

Zweck

  • Komplexität kapseln: UI-Logik in einer Einheit bündeln
  • Wiederverwendbarkeit: In mehreren Views einsetzen
  • Testbarkeit: Einfach zu testen durch Entkopplung
  • Einsatz: Dynamische Widgets, Navigation, Formulare, Mini-Dashboards

Best Practices

  • Benennung: Klassenname endet auf ViewComponent
  • Struktur:
    • Klassen: ViewComponents/
    • Views: Views/Shared/Components/{Name}/{View}.cshtml
  • Starke Typisierung: Übergabe per ViewModel statt ViewBag
  • Asynchron: Nutze InvokeAsync für Datenoperationen
  • Trennung der Logik: Nur UI-Logik, keine Geschäftslogik

Was vermeiden

  • Übermäßiger Einsatz bei einfachen UI-Teilen
  • Direkte Datenbankzugriffe – verwende Services
  • Starke Kopplung an bestimmte Controller
  • Umfangreiche Businesslogik innerhalb der Komponente

Struktur eines View Components

GridViewComponent.cs

public class GridViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
        var model = new PersonGridModel
        {
            GridTitle = "Personenliste",
            Persons = new List<Person>
            {
                new Person { PersonName = "John", JobTitle = "Manager" },
                new Person { PersonName = "Jones", JobTitle = "Stellv. Manager" },
                new Person { PersonName = "William", JobTitle = "Sachbearbeiter" }
            }
        };
        return View("Sample", model);
    }
}

View aufrufen (z. B. Index.cshtml)

@await Component.InvokeAsync("Grid")

View-Komponente Sample.cshtml

@model PersonGridModel

<div class="box">
    <h3>@Model.GridTitle</h3>
    <table class="table w-100">
        <thead><tr><th>Name</th><th>Job</th></tr></thead>
        <tbody>
        @foreach (var person in Model.Persons)
        {
            <tr><td>@person.PersonName</td><td>@person.JobTitle</td></tr>
        }
        </tbody>
    </table>
</div>

Übergabe von Parametern

ViewComponent mit Parameter

public async Task<IViewComponentResult> InvokeAsync(PersonGridModel grid)
{
    return View("Sample", grid);
}

View (z. B. Index.cshtml)

@{
    var model = new PersonGridModel { /* ... */ };
}
@await Component.InvokeAsync("Grid", new { grid = model })

Alternative mit Tag Helper

<vc:grid grid="model"></vc:grid>

ViewComponentResult aus Controller

[Route("freunde")]
public IActionResult LoadFriendsList()
{
    var model = new PersonGridModel
    {
        GridTitle = "Freunde",
        Persons = new List<Person> { /* ... */ }
    };
    return ViewComponent("Grid", new { grid = model });
}

Zusammenfassung

  • Struktur: ViewComponents-Ordner, Razor Views im Shared-Ordner
  • Aufruf: @await Component.InvokeAsync("Name", new { ... })
  • Asynchron: Immer InvokeAsync verwenden
  • Starke Typisierung: Verwende ViewModels
  • Trennung: Keine Geschäftslogik oder DB-Zugriff im ViewComponent