Kurs:Razor Views: Unterschied zwischen den Versionen

Aus ahrensburg.city
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
Absolut\! Hier ist eine Umformulierung des von Ihnen bereitgestellten technischen Texts in eine strukturierte und verständliche Kursbeschreibung. Der Inhalt wurde neu geordnet und in einem didaktischen Format aufbereitet, das sich ideal für Lernende eignet.
Absolut! Hier ist die Umwandlung des bereitgestellten Markdown-Inhalts in MediaWiki-Syntax:


<nowiki>-----</nowiki>
-----


<nowiki>###</nowiki> **Kurs: Professionelle Webentwicklung mit ASP.NET Core MVC**
= '''Kurs: Professionelle Webentwicklung mit ASP.NET Core MVC''' =


Willkommen zu diesem Kurs über das Model-View-Controller (MVC) Architekturmuster in ASP.NET Core\! Hier lernen Sie, wie Sie saubere, wartbare und skalierbare Webanwendungen entwickeln, indem Sie die Logik Ihrer Anwendung klar strukturieren.
Willkommen zu diesem Kurs über das Model-View-Controller (MVC) Architekturmuster in ASP.NET Core! Hier lernen Sie, wie Sie saubere, wartbare und skalierbare Webanwendungen entwickeln, indem Sie die Logik Ihrer Anwendung klar strukturieren.


<nowiki>-----</nowiki>
-----


<nowiki>####</nowiki> **Lektion 1: Das Fundament – Das MVC-Architekturmuster**
== '''Lektion 1: Das Fundament – Das MVC-Architekturmuster''' ==


Das Herzstück moderner Webanwendungen ist eine saubere Architektur. Das Model-View-Controller (MVC) Muster ist ein bewährter Ansatz, der den Code in drei logische Hauptkomponenten unterteilt.
Das Herzstück moderner Webanwendungen ist eine saubere Architektur. Das Model-View-Controller (MVC) Muster ist ein bewährter Ansatz, der den Code in drei logische Hauptkomponenten unterteilt.


<nowiki>**</nowiki>Ziele und Vorteile:**
'''Ziele und Vorteile:'''
* '''Klare Trennung der Verantwortlichkeiten (Separation of Concerns):''' Jede Komponente hat genau eine Aufgabe. Das macht den Code verständlicher und Fehler leichter auffindbar.
* '''Parallele Entwicklung:''' Teams können gleichzeitig am Datenmodell, der Benutzeroberfläche und der Anwendungslogik arbeiten.
* '''Einfacheres Testen:''' Jede Komponente kann isoliert getestet werden (Unit-Testing), was die Qualität Ihrer Software enorm steigert.
* '''Wartbarkeit:''' Änderungen in einer Komponente (z. B. im Design der View) haben minimale bis keine Auswirkungen auf die anderen Komponenten.


  * **Klare Trennung der Verantwortlichkeiten (Separation of Concerns):** Jede Komponente hat genau eine Aufgabe. Das macht den Code verständlicher und Fehler leichter auffindbar.
Das wichtigste Prinzip ist die Unabhängigkeit des '''Models'''. Es kennt weder die View noch den Controller und kann daher völlig eigenständig entwickelt und getestet werden.


  * **Parallele Entwicklung:** Teams können gleichzeitig am Datenmodell, der Benutzeroberfläche und der Anwendungslogik arbeiten.
-----


  * **Einfacheres Testen:** Jede Komponente kann isoliert getestet werden (Unit-Testing), was die Qualität Ihrer Software enorm steigert.
== '''Lektion 2: Die drei Hauptakteure und ihre Rollen''' ==
 
  * **Wartbarkeit:** Änderungen in einer Komponente (z. B. im Design der View) haben minimale bis keine Auswirkungen auf die anderen Komponenten.
 
Das wichtigste Prinzip ist die Unabhängigkeit des **Models**. Es kennt weder die View noch den Controller und kann daher völlig eigenständig entwickelt und getestet werden.
 
<nowiki>-----</nowiki>
 
<nowiki>####</nowiki> **Lektion 2: Die drei Hauptakteure und ihre Rollen**


Um das MVC-Muster zu verstehen, müssen wir die Verantwortlichkeiten der einzelnen Komponenten kennen. Stellen Sie sich den Ablauf einer Anfrage vor:
Um das MVC-Muster zu verstehen, müssen wir die Verantwortlichkeiten der einzelnen Komponenten kennen. Stellen Sie sich den Ablauf einer Anfrage vor:


1.  **Der Controller: Der Dirigent**
# '''Der Controller: Der Dirigent'''
#* Empfängt die HTTP-Anfrage des Benutzers (z. B. das Aufrufen einer URL).
#* Er ist der Koordinator: Er ruft das Geschäftsmodell auf, um Daten abzufragen oder zu bearbeiten.
#* Anschließend wählt er die passende '''View''' aus, um die Daten darzustellen.


      * Empfängt die HTTP-Anfrage des Benutzers (z. B. das Aufrufen einer URL).
# '''Das Geschäftsmodell (Model): Das Gehirn'''
#* Enthält die gesamte Geschäftslogik und die Daten Ihrer Anwendung.
#* Führt Operationen aus, wie z. B. das Lesen und Schreiben von Daten in einer Datenbank.
#* Es ist die "Quelle der Wahrheit" und gibt die verarbeiteten Daten an den Controller zurück. Es hat keinerlei Kenntnis von der Benutzeroberfläche.


      * Er ist der Koordinator: Er ruft das Geschäftsmodell auf, um Daten abzufragen oder zu bearbeiten.
# '''Die View: Das Gesicht'''
#* Ist für die reine Darstellung der Daten verantwortlich (HTML-Code).
#* Sie empfängt die vom Controller vorbereiteten Daten und stellt sie dar.
#* Die View selbst enthält keine Geschäftslogik. Sie sollte nur Code enthalten, der für die Präsentation notwendig ist.


      * Anschließend wählt er die passende **View** aus, um die Daten darzustellen.
'''Der Datenfluss im Überblick:''' 
Anfrage → '''Controller''' → Ruft '''Model''' auf → Model liefert Daten zurück → '''Controller''' übergibt Daten an '''View''' → View wird gerendert und als Antwort an den Benutzer gesendet.


2.  **Das Geschäftsmodell (Model): Das Gehirn**
-----


      * Enthält die gesamte Geschäftslogik und die Daten Ihrer Anwendung.
== '''Lektion 3: Dynamische Ansichten mit der Razor View Engine''' ==


      * Führt Operationen aus, wie z. B. das Lesen und Schreiben von Daten in einer Datenbank.
Eine View ist mehr als nur statisches HTML. Mit der Razor View Engine können wir C#-Code direkt in unsere <code>.cshtml</code>-Dateien einbetten, um dynamische Inhalte zu erzeugen.


      * Es ist die "Quelle der Wahrheit" und gibt die verarbeiteten Daten an den Controller zurück. Es hat keinerlei Kenntnis von der Benutzeroberfläche.
* Das <code>@</code>-Zeichen leitet Razor-Syntax ein.
* Razor ermöglicht es uns, Daten aus unserem Modell direkt im HTML auszugeben und Logik für die Darstellung zu implementieren.


3.  **Die View: Das Gesicht**
'''Wichtige Razor-Konstrukte:'''
* '''Ausdrücke (<code>@Model.Username</code>):''' Geben den Wert einer Variable oder Eigenschaft aus.
* '''Codeblöcke (<code>@{ ... }</code>):''' Führen eine oder mehrere Zeilen C#-Code aus.
* '''Kontrollstrukturen:''' Sie können bekannte C#-Strukturen wie <code>if-else</code>, <code>switch</code>, <code>foreach</code> und <code>for</code> verwenden, um die Darstellung zu steuern.
* '''Lokale Funktionen:''' Sie können kleine Hilfsfunktionen direkt in Ihrer View definieren.


      * Ist für die reine Darstellung der Daten verantwortlich (HTML-Code).
'''Wichtig:''' Die Logik in einer View sollte sich ausschließlich auf die '''Präsentation''' beschränken! Komplexe Berechnungen gehören in das Model oder den Controller.


      * Sie empfängt die vom Controller vorbereiteten Daten und stellt sie dar.
-----


      * Die View selbst enthält keine Geschäftslogik. Sie sollte nur Code enthalten, der für die Präsentation notwendig ist.
== '''Lektion 4: Daten vom Controller an die View übergeben''' ==
 
<nowiki>**</nowiki>Der Datenfluss im Überblick:**
 
Anfrage → **Controller** → Ruft **Model** auf → Model liefert Daten zurück → **Controller** übergibt Daten an **View** → View wird gerendert und als Antwort an den Benutzer gesendet.
 
<nowiki>-----</nowiki>
 
<nowiki>####</nowiki> **Lektion 3: Dynamische Ansichten mit der Razor View Engine**
 
Eine View ist mehr als nur statisches HTML. Mit der Razor View Engine können wir C\#-Code direkt in unsere `.cshtml`-Dateien einbetten, um dynamische Inhalte zu erzeugen.
 
  * Das `@`-Zeichen leitet Razor-Syntax ein.
 
  * Razor ermöglicht es uns, Daten aus unserem Modell direkt im HTML auszugeben und Logik für die Darstellung zu implementieren.
 
<nowiki>**</nowiki>Wichtige Razor-Konstrukte:**
 
  * **Ausdrücke (`@Model.Username`):** Geben den Wert einer Variable oder Eigenschaft aus.
 
  * **Codeblöcke (`@{ ... }`):** Führen eine oder mehrere Zeilen C\#-Code aus.
 
  * **Kontrollstrukturen:** Sie können bekannte C\#-Strukturen wie `if-else`, `switch`, `foreach` und `for` verwenden, um die Darstellung zu steuern.
 
  * **Lokale Funktionen:** Sie können kleine Hilfsfunktionen direkt in Ihrer View definieren.
 
<nowiki>**</nowiki>Wichtig:** Die Logik in einer View sollte sich ausschließlich auf die **Präsentation** beschränken\! Komplexe Berechnungen gehören in das Model oder den Controller.
 
<nowiki>-----</nowiki>
 
<nowiki>####</nowiki> **Lektion 4: Daten vom Controller an die View übergeben**


Doch wie gelangen die Daten vom Controller in die View? Dafür gibt es mehrere Mechanismen. Wir beginnen mit zwei einfachen, aber "schwach typisierten" Ansätzen.
Doch wie gelangen die Daten vom Controller in die View? Dafür gibt es mehrere Mechanismen. Wir beginnen mit zwei einfachen, aber "schwach typisierten" Ansätzen.


<nowiki>#####</nowiki> **1. ViewData**
=== '''1. ViewData''' ===


`ViewData` ist ein Wörterbuch-Objekt (`Dictionary<string, object>`), in dem Sie Daten unter einem bestimmten Schlüssel ablegen können.
<code>ViewData</code> ist ein Wörterbuch-Objekt (<code>Dictionary&lt;string, object&gt;</code>), in dem Sie Daten unter einem bestimmten Schlüssel ablegen können.


  * **Im Controller:** `ViewData["Titel"] = "Produktliste";`
* '''Im Controller:''' <code>ViewData["Titel"] = "Produktliste";</code>
* '''In der View:''' <code>&lt;h1&gt;@ViewData["Titel"]&lt;/h1&gt;</code>


  * **In der View:** `<nowiki><h1>@ViewData["Titel"]</h1></nowiki>`
Da die Werte als <code>object</code> gespeichert werden, müssen Sie sie bei komplexeren Datentypen oft umwandeln (casten), was fehleranfällig sein kann. 
<code>@(ViewData["Produkt"] as Produkt).Name</code>


Da die Werte als `object` gespeichert werden, müssen Sie sie bei komplexeren Datentypen oft umwandeln (casten), was fehleranfällig sein kann.
=== '''2. ViewBag''' ===


`@(ViewData["Produkt"] as Produkt).Name`
<code>ViewBag</code> ist ein dynamisches Objekt, das im Hintergrund <code>ViewData</code> verwendet, aber eine einfachere Syntax bietet.


<nowiki>#####</nowiki> **2. ViewBag**
* '''Im Controller:''' <code>ViewBag.Titel = "Produktliste";</code>
* '''In der View:''' <code>&lt;h1&gt;@ViewBag.Titel&lt;/h1&gt;</code>


`ViewBag` ist ein dynamisches Objekt, das im Hintergrund `ViewData` verwendet, aber eine einfachere Syntax bietet.
'''Vorteile von <code>ViewBag</code>:'''
* Einfachere, sauberere Syntax (<code>ViewBag.Eigenschaft</code>).
* Kein explizites Umwandeln (Casting) notwendig.


  * **Im Controller:** `ViewBag.Titel = "Produktliste";`
'''Nachteil beider Ansätze:''' Es gibt keine Überprüfung zur Kompilierzeit. Ein Tippfehler im Schlüssel (<code>ViewData["Titl"]</code>) oder im Eigenschaftsnamen (<code>ViewBag.Titl</code>) wird erst zur Laufzeit als Fehler bemerkt.


  * **In der View:** `<nowiki><h1>@ViewBag.Titel</h1></nowiki>`
-----


<nowiki>**</nowiki>Vorteile von `ViewBag`:**
== '''Lektion 5: Der Königsweg – Stark typisierte Views''' ==


  * Einfachere, sauberere Syntax (`ViewBag.Eigenschaft`).
Für robuste und wartbare Anwendungen ist die Verwendung von '''stark typisierten Views''' der empfohlene Standard. Eine stark typisierte View ist fest an eine bestimmte Modellklasse gebunden.


  * Kein explizites Umwandeln (Casting) notwendig.
'''Und so funktioniert's:'''


<nowiki>**</nowiki>Nachteil beider Ansätze:** Es gibt keine Überprüfung zur Kompilierzeit. Ein Tippfehler im Schlüssel (`ViewData["Titl"]`) oder im Eigenschaftsnamen (`ViewBag.Titl`) wird erst zur Laufzeit als Fehler bemerkt.
# '''Im Controller:''' Sie erstellen eine Instanz Ihres Modells und übergeben diese direkt an die <code>View()</code>-Methode.
<syntaxhighlight lang="csharp">
public IActionResult Details(int id)
{
    Produkt meinProdukt = _db.Produkte.Find(id);
    return View(meinProdukt); // Übergabe des gesamten Objekts
}
</syntaxhighlight>


<nowiki>-----</nowiki>
# '''In der View:''' Sie deklarieren mit der <code>@model</code>-Direktive, welchen Datentyp die View erwartet.
<syntaxhighlight lang="csharp">
@model Projekt.Modelle.Produkt


<nowiki>####</nowiki> **Lokalektion 5: Der Königsweg – Stark typisierte Views**
<h1>@Model.Name</h1>
<p>Preis: @Model.Preis.ToString("c")</p>
<p>Beschreibung: @Model.Beschreibung</p>
</syntaxhighlight>


Für robuste und wartbare Anwendungen ist die Verwendung von **stark typisierten Views** der empfohlene Standard. Eine stark typisierte View ist fest an eine bestimmte Modellklasse gebunden.
'''Die unschlagbaren Vorteile:'''
* '''IntelliSense:''' Der Editor kennt Ihr Modell und schlägt Ihnen die verfügbaren Eigenschaften vor.
* '''Kompilierzeit-Sicherheit:''' Tippfehler bei Eigenschaftsnamen (<code>@Model.Naem</code>) führen zu einem Kompilierfehler und werden sofort entdeckt.
* '''Klarheit:''' Es ist sofort ersichtlich, welche Daten diese View für ihre Darstellung benötigt.


<nowiki>**</nowiki>Und so funktioniert's:**
-----


1.  **Im Controller:** Sie erstellen eine Instanz Ihres Modells und übergeben diese direkt an die `View()`-Methode.
== '''Lektion 6: Code organisieren und wiederverwenden''' ==
 
    ```csharp
 
    public IActionResult Details(int id)
 
    {
 
        Produkt meinProdukt = _db.Produkte.Find(id);
 
        return View(meinProdukt); // Übergabe des gesamten Objekts
 
    }
 
    ```
 
2.  **In der View:** Sie deklarieren mit der `@model`-Direktive, welchen Datentyp die View erwartet.
 
    ```csharp
 
    @model Projekt.Modelle.Produkt
 
    <nowiki><h1>@Model.Name</h1></nowiki>
 
    <nowiki><p>Preis: @Model.Preis.ToString("c")</p></nowiki>
 
    <nowiki><p>Beschreibung: @Model.Beschreibung</p></nowiki>
 
    ```
 
<nowiki>**</nowiki>Die unschlagbaren Vorteile:**
 
  * **IntelliSense:** Der Editor kennt Ihr Modell und schlägt Ihnen die verfügbaren Eigenschaften vor.
 
  * **Kompilierzeit-Sicherheit:** Tippfehler bei Eigenschaftsnamen (`@Model.Naem`) führen zu einem Kompilierfehler und werden sofort entdeckt.
 
  * **Klarheit:** Es ist sofort ersichtlich, welche Daten diese View für ihre Darstellung benötigt.
 
<nowiki>-----</nowiki>
 
<nowiki>####</nowiki> **Lektion 6: Code organisieren und wiederverwenden**


Für größere Projekte sind Struktur und Wiederverwendbarkeit entscheidend.
Für größere Projekte sind Struktur und Wiederverwendbarkeit entscheidend.


<nowiki>#####</nowiki> **ViewImports.cshtml**
=== '''ViewImports.cshtml''' ===
 
Diese spezielle Datei im `Views`-Ordner ist der perfekte Ort, um Namespaces zu importieren (`@using Projekt.Modelle`) oder Tag Helper zu registrieren, die in vielen Views benötigt werden. Der Inhalt von `ViewImports.cshtml` wird automatisch auf alle Views im selben Ordner und in Unterordnern angewendet.
 
<nowiki>#####</nowiki> **Geteilte Views (Shared Views)**


Views, die von mehreren Controllern verwendet werden (z. B. Layout-Dateien, Navigationsleisten, Fehlerseiten), sollten im Ordner `/Views/Shared` abgelegt werden. Wenn ein Controller eine View anfordert, sucht das Framework zuerst im spezifischen Ordner des Controllers (`/Views/ControllerName`) und danach im `/Views/Shared`-Ordner.
Diese spezielle Datei im <code>Views</code>-Ordner ist der perfekte Ort, um Namespaces zu importieren (<code>@using Projekt.Modelle</code>) oder Tag Helper zu registrieren, die in vielen Views benötigt werden. Der Inhalt von <code>ViewImports.cshtml</code> wird automatisch auf alle Views im selben Ordner und in Unterordnern angewendet.


<nowiki>#####</nowiki> **Die View-Auflösung**
=== '''Geteilte Views (Shared Views)''' ===


Zusammenfassend sucht ASP.NET Core eine View `MeineView` für den `HomeController` in dieser Reihenfolge:
Views, die von mehreren Controllern verwendet werden (z. B. Layout-Dateien, Navigationsleisten, Fehlerseiten), sollten im Ordner <code>/Views/Shared</code> abgelegt werden. Wenn ein Controller eine View anfordert, sucht das Framework zuerst im spezifischen Ordner des Controllers (<code>/Views/ControllerName</code>) und danach im <code>/Views/Shared</code>-Ordner.


1.  `/Views/Home/MeineView.cshtml`
=== '''Die View-Auflösung''' ===


2.  `/Views/Shared/MeineView.cshtml`
Zusammenfassend sucht ASP.NET Core eine View <code>MeineView</code> für den <code>HomeController</code> in dieser Reihenfolge:
# <code>/Views/Home/MeineView.cshtml</code>
# <code>/Views/Shared/MeineView.cshtml</code>

Aktuelle Version vom 21. Juni 2025, 06:35 Uhr

Absolut! Hier ist die Umwandlung des bereitgestellten Markdown-Inhalts in MediaWiki-Syntax:


Kurs: Professionelle Webentwicklung mit ASP.NET Core MVC

Willkommen zu diesem Kurs über das Model-View-Controller (MVC) Architekturmuster in ASP.NET Core! Hier lernen Sie, wie Sie saubere, wartbare und skalierbare Webanwendungen entwickeln, indem Sie die Logik Ihrer Anwendung klar strukturieren.


Lektion 1: Das Fundament – Das MVC-Architekturmuster

Das Herzstück moderner Webanwendungen ist eine saubere Architektur. Das Model-View-Controller (MVC) Muster ist ein bewährter Ansatz, der den Code in drei logische Hauptkomponenten unterteilt.

Ziele und Vorteile:

  • Klare Trennung der Verantwortlichkeiten (Separation of Concerns): Jede Komponente hat genau eine Aufgabe. Das macht den Code verständlicher und Fehler leichter auffindbar.
  • Parallele Entwicklung: Teams können gleichzeitig am Datenmodell, der Benutzeroberfläche und der Anwendungslogik arbeiten.
  • Einfacheres Testen: Jede Komponente kann isoliert getestet werden (Unit-Testing), was die Qualität Ihrer Software enorm steigert.
  • Wartbarkeit: Änderungen in einer Komponente (z. B. im Design der View) haben minimale bis keine Auswirkungen auf die anderen Komponenten.

Das wichtigste Prinzip ist die Unabhängigkeit des Models. Es kennt weder die View noch den Controller und kann daher völlig eigenständig entwickelt und getestet werden.


Lektion 2: Die drei Hauptakteure und ihre Rollen

Um das MVC-Muster zu verstehen, müssen wir die Verantwortlichkeiten der einzelnen Komponenten kennen. Stellen Sie sich den Ablauf einer Anfrage vor:

  1. Der Controller: Der Dirigent
    • Empfängt die HTTP-Anfrage des Benutzers (z. B. das Aufrufen einer URL).
    • Er ist der Koordinator: Er ruft das Geschäftsmodell auf, um Daten abzufragen oder zu bearbeiten.
    • Anschließend wählt er die passende View aus, um die Daten darzustellen.
  1. Das Geschäftsmodell (Model): Das Gehirn
    • Enthält die gesamte Geschäftslogik und die Daten Ihrer Anwendung.
    • Führt Operationen aus, wie z. B. das Lesen und Schreiben von Daten in einer Datenbank.
    • Es ist die "Quelle der Wahrheit" und gibt die verarbeiteten Daten an den Controller zurück. Es hat keinerlei Kenntnis von der Benutzeroberfläche.
  1. Die View: Das Gesicht
    • Ist für die reine Darstellung der Daten verantwortlich (HTML-Code).
    • Sie empfängt die vom Controller vorbereiteten Daten und stellt sie dar.
    • Die View selbst enthält keine Geschäftslogik. Sie sollte nur Code enthalten, der für die Präsentation notwendig ist.

Der Datenfluss im Überblick: Anfrage → Controller → Ruft Model auf → Model liefert Daten zurück → Controller übergibt Daten an View → View wird gerendert und als Antwort an den Benutzer gesendet.


Lektion 3: Dynamische Ansichten mit der Razor View Engine

Eine View ist mehr als nur statisches HTML. Mit der Razor View Engine können wir C#-Code direkt in unsere .cshtml-Dateien einbetten, um dynamische Inhalte zu erzeugen.

  • Das @-Zeichen leitet Razor-Syntax ein.
  • Razor ermöglicht es uns, Daten aus unserem Modell direkt im HTML auszugeben und Logik für die Darstellung zu implementieren.

Wichtige Razor-Konstrukte:

  • Ausdrücke (@Model.Username): Geben den Wert einer Variable oder Eigenschaft aus.
  • Codeblöcke (@{ ... }): Führen eine oder mehrere Zeilen C#-Code aus.
  • Kontrollstrukturen: Sie können bekannte C#-Strukturen wie if-else, switch, foreach und for verwenden, um die Darstellung zu steuern.
  • Lokale Funktionen: Sie können kleine Hilfsfunktionen direkt in Ihrer View definieren.

Wichtig: Die Logik in einer View sollte sich ausschließlich auf die Präsentation beschränken! Komplexe Berechnungen gehören in das Model oder den Controller.


Lektion 4: Daten vom Controller an die View übergeben

Doch wie gelangen die Daten vom Controller in die View? Dafür gibt es mehrere Mechanismen. Wir beginnen mit zwei einfachen, aber "schwach typisierten" Ansätzen.

1. ViewData

ViewData ist ein Wörterbuch-Objekt (Dictionary<string, object>), in dem Sie Daten unter einem bestimmten Schlüssel ablegen können.

  • Im Controller: ViewData["Titel"] = "Produktliste";
  • In der View: <h1>@ViewData["Titel"]</h1>

Da die Werte als object gespeichert werden, müssen Sie sie bei komplexeren Datentypen oft umwandeln (casten), was fehleranfällig sein kann. @(ViewData["Produkt"] as Produkt).Name

2. ViewBag

ViewBag ist ein dynamisches Objekt, das im Hintergrund ViewData verwendet, aber eine einfachere Syntax bietet.

  • Im Controller: ViewBag.Titel = "Produktliste";
  • In der View: <h1>@ViewBag.Titel</h1>

Vorteile von ViewBag:

  • Einfachere, sauberere Syntax (ViewBag.Eigenschaft).
  • Kein explizites Umwandeln (Casting) notwendig.

Nachteil beider Ansätze: Es gibt keine Überprüfung zur Kompilierzeit. Ein Tippfehler im Schlüssel (ViewData["Titl"]) oder im Eigenschaftsnamen (ViewBag.Titl) wird erst zur Laufzeit als Fehler bemerkt.


Lektion 5: Der Königsweg – Stark typisierte Views

Für robuste und wartbare Anwendungen ist die Verwendung von stark typisierten Views der empfohlene Standard. Eine stark typisierte View ist fest an eine bestimmte Modellklasse gebunden.

Und so funktioniert's:

  1. Im Controller: Sie erstellen eine Instanz Ihres Modells und übergeben diese direkt an die View()-Methode.
public IActionResult Details(int id)
{
    Produkt meinProdukt = _db.Produkte.Find(id);
    return View(meinProdukt); // Übergabe des gesamten Objekts
}
  1. In der View: Sie deklarieren mit der @model-Direktive, welchen Datentyp die View erwartet.
@model Projekt.Modelle.Produkt

<h1>@Model.Name</h1>
<p>Preis: @Model.Preis.ToString("c")</p>
<p>Beschreibung: @Model.Beschreibung</p>

Die unschlagbaren Vorteile:

  • IntelliSense: Der Editor kennt Ihr Modell und schlägt Ihnen die verfügbaren Eigenschaften vor.
  • Kompilierzeit-Sicherheit: Tippfehler bei Eigenschaftsnamen (@Model.Naem) führen zu einem Kompilierfehler und werden sofort entdeckt.
  • Klarheit: Es ist sofort ersichtlich, welche Daten diese View für ihre Darstellung benötigt.

Lektion 6: Code organisieren und wiederverwenden

Für größere Projekte sind Struktur und Wiederverwendbarkeit entscheidend.

ViewImports.cshtml

Diese spezielle Datei im Views-Ordner ist der perfekte Ort, um Namespaces zu importieren (@using Projekt.Modelle) oder Tag Helper zu registrieren, die in vielen Views benötigt werden. Der Inhalt von ViewImports.cshtml wird automatisch auf alle Views im selben Ordner und in Unterordnern angewendet.

Geteilte Views (Shared Views)

Views, die von mehreren Controllern verwendet werden (z. B. Layout-Dateien, Navigationsleisten, Fehlerseiten), sollten im Ordner /Views/Shared abgelegt werden. Wenn ein Controller eine View anfordert, sucht das Framework zuerst im spezifischen Ordner des Controllers (/Views/ControllerName) und danach im /Views/Shared-Ordner.

Die View-Auflösung

Zusammenfassend sucht ASP.NET Core eine View MeineView für den HomeController in dieser Reihenfolge:

  1. /Views/Home/MeineView.cshtml
  2. /Views/Shared/MeineView.cshtml