Webframeworkk/ASP.NET Core/Controllers und IActionResult: Unterschied zwischen den Versionen

Aus Dokument
Zur Navigation springen Zur Suche springen
imported>Import
Version 183
 
Zeile 8: Zeile 8:


== Zweck ==
== Zweck ==
* **Logik organisieren**: Controller bieten eine logische Gruppierung für Aktionen, die auf demselben Datentyp oder derselben Funktionalität arbeiten.
* **Logik organisieren**: Controller bieten eine logische Gruppierung für Aktionen, die auf demselben Datentyp oder derselben Funktionalität arbeiten.
* **Anfragen behandeln**: Sie sind verantwortlich für das Verarbeiten von Requests, das Abrufen notwendiger Daten und das Vorbereiten einer Antwort.
* **Anfragen behandeln**: Sie sind verantwortlich für das Verarbeiten von Requests, das Abrufen notwendiger Daten und das Vorbereiten einer Antwort.
Zeile 14: Zeile 13:


== Syntax und Konventionen ==
== Syntax und Konventionen ==
 
* **Klassenbenennung**: Controller-Klassennamen sollten auf "Controller" enden (z.B. `HomeController`, `ProductsController`).
* **Klassenbenennung**: Controller-Klassennamen sollten auf “Controller” enden (z.B. `HomeController`, `ProductsController`).
* **Vererbung**: Controller erben von der Basisklasse `Controller` (oder `ControllerBase` für API-Controller).
* **Vererbung**: Controller erben von der Basisklasse `Controller` (oder `ControllerBase` für API-Controller).
* **Action Method Benennung**: Methoden können jeden gültigen C#-Namen haben.
* **Action Method Benennung**: Methoden können jeden gültigen C#-Namen haben.
Zeile 21: Zeile 19:


=== Code-Beispiel ===
=== Code-Beispiel ===
 
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">// HomeController.cs
// HomeController.cs
namespace ControllersExample.Controllers
namespace ControllersExample.Controllers
{
{
Zeile 40: Zeile 38:
         }
         }
     }
     }
}</syntaxhighlight>
}
</syntaxhighlight>
 
== Einrichtung in Program.cs ==
== Einrichtung in Program.cs ==
Um Controller zu verwenden, müssen sie registriert und dem Routing-System hinzugefügt werden:
Um Controller zu verwenden, müssen sie registriert und dem Routing-System hinzugefügt werden:


<syntaxhighlight lang="csharp">var builder = WebApplication.CreateBuilder(args);
<syntaxhighlight lang="csharp">
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(); // Aktiviert MVC Controller
builder.Services.AddControllers(); // Aktiviert MVC Controller


Zeile 51: Zeile 51:
app.UseRouting();
app.UseRouting();
app.MapControllers(); // Verbindet Controller mit dem Routing-System
app.MapControllers(); // Verbindet Controller mit dem Routing-System
app.Run();</syntaxhighlight>
app.Run();
</syntaxhighlight>
 
= IActionResult =
= IActionResult =
Das `IActionResult` Interface ist ein Kernkonzept in ASP.NET Core MVC. Es dient als Rückgabetyp für Action Methods und ermöglicht es, je nach Kontext der Anfrage unterschiedliche Arten von Antworten zurückzugeben.
Das `IActionResult` Interface ist ein Kernkonzept in ASP.NET Core MVC. Es dient als Rückgabetyp für Action Methods und ermöglicht es, je nach Kontext der Anfrage unterschiedliche Arten von Antworten zurückzugeben.


Es definiert einen Vertrag mit einer einzigen Methode:
Es definiert einen Vertrag mit einer einzigen Methode:
<syntaxhighlight lang="csharp">
Task ExecuteResultAsync(ActionContext context);
</syntaxhighlight>


<syntaxhighlight lang="csharp">Task ExecuteResultAsync(ActionContext context);</syntaxhighlight>
== Rückgabetypen (Action Results) ==
== Rückgabetypen (Action Results) ==
Hier sind die wichtigsten von `IActionResult` abgeleiteten Ergebnistypen:
Hier sind die wichtigsten von `IActionResult` abgeleiteten Ergebnistypen:


=== ContentResult ===
=== ContentResult ===
Gibt rohen Inhalt (Text, HTML, JSON, etc.) zurück, ohne eine View zu rendern.
Gibt rohen Inhalt (Text, HTML, JSON, etc.) zurück, ohne eine View zu rendern.
* **Einsatz**: Einfache Textnachrichten, API-Antworten oder benutzerdefinierte Formate.
* **Einsatz**: Einfache Textnachrichten, API-Antworten oder benutzerdefinierte Formate.
* **Eigenschaften**: `Content` (Inhalt), `ContentType` (MIME-Type, z.B. `text/html`).
* **Eigenschaften**: `Content` (Inhalt), `ContentType` (MIME-Type, z.B. `text/html`).


<syntaxhighlight lang="csharp">// Verwendung der Helper-Methode
<syntaxhighlight lang="csharp">
// Verwendung der Helper-Methode
public ContentResult Index()
public ContentResult Index()
{
{
     return Content("<h1>Welcome</h1>", "text/html");
     return Content("<h1>Welcome</h1>", "text/html");
}</syntaxhighlight>
}
</syntaxhighlight>
 
=== JsonResult ===
=== JsonResult ===
Serialisiert ein Objekt in JSON-Format und gibt es zurück.
Serialisiert ein Objekt in JSON-Format und gibt es zurück.
* **Einsatz**: RESTful APIs, AJAX-Antworten.
* **Einsatz**: RESTful APIs, AJAX-Antworten.
* **ContentType**: Setzt automatisch `application/json`.
* **ContentType**: Setzt automatisch `application/json`.


<syntaxhighlight lang="csharp">public JsonResult Person()
<syntaxhighlight lang="csharp">
public JsonResult Person()
{
{
     var person = new { FirstName = "James", LastName = "Smith", Age = 25 };
     var person = new { FirstName = "James", LastName = "Smith", Age = 25 };
     return Json(person); // Helper-Methode
     return Json(person); // Helper-Methode
}</syntaxhighlight>
}
</syntaxhighlight>
 
=== FileResult ===
=== FileResult ===
Dient zum Senden von Dateien (PDF, Bilder, Dokumente) an den Client.
Dient zum Senden von Dateien (PDF, Bilder, Dokumente) an den Client.


VirtualFileResult<br />
;VirtualFileResult
Dient Dateien aus dem Web-Root (`wwwroot`) oder einem virtuellen Pfad.
: Dient Dateien aus dem Web-Root (`wwwroot`) oder einem virtuellen Pfad.
<syntaxhighlight lang="csharp">
return File("/sample.pdf", "application/pdf");
</syntaxhighlight>


<syntaxhighlight lang="csharp">return File("/sample.pdf", "application/pdf");</syntaxhighlight>
;PhysicalFileResult
PhysicalFileResult<br />
: Dient Dateien von einem absoluten physischen Pfad auf dem Server. **Vorsicht**: Sicherheit beachten!
Dient Dateien von einem absoluten physischen Pfad auf dem Server. **Vorsicht**: Sicherheit beachten!
<syntaxhighlight lang="csharp">
return PhysicalFile(@"c:\aspnetcore\sample.pdf", "application/pdf");
</syntaxhighlight>


<syntaxhighlight lang="csharp">return PhysicalFile(@"c:\aspnetcore\sample.pdf", "application/pdf");</syntaxhighlight>
;FileContentResult
FileContentResult<br />
: Dient Dateien aus einem Byte-Array im Speicher.
Dient Dateien aus einem Byte-Array im Speicher.
<syntaxhighlight lang="csharp">
byte[] bytes = System.IO.File.ReadAllBytes(@"c:\sample.pdf");
return File(bytes, "application/pdf");
</syntaxhighlight>


<syntaxhighlight lang="csharp">byte[] bytes = System.IO.File.ReadAllBytes(@"c:\sample.pdf");
return File(bytes, "application/pdf");</syntaxhighlight>
=== Status Code Results ===
=== Status Code Results ===
Ermöglicht das Senden standardisierter HTTP-Statuscodes, um den Client über das Ergebnis der Anfrage zu informieren.
Ermöglicht das Senden standardisierter HTTP-Statuscodes, um den Client über das Ergebnis der Anfrage zu informieren.


Zeile 114: Zeile 122:
* **StatusCodeResult**: Jeder beliebige Statuscode.
* **StatusCodeResult**: Jeder beliebige Statuscode.


<syntaxhighlight lang="csharp">public IActionResult GetBook(int id)
<syntaxhighlight lang="csharp">
public IActionResult GetBook(int id)
{
{
     if (id <= 0)
     if (id <= 0)
Zeile 127: Zeile 136:


     return Ok(); // 200
     return Ok(); // 200
}</syntaxhighlight>
}
</syntaxhighlight>
 
=== Redirect Results ===
=== Redirect Results ===
Leitet den Browser zu einer anderen URL um.
Leitet den Browser zu einer anderen URL um.


RedirectResult<br />
;RedirectResult
Leitet zu einer URL weiter (absolut oder relativ).
: Leitet zu einer URL weiter (absolut oder relativ).
<syntaxhighlight lang="csharp">
return Redirect("/home");
</syntaxhighlight>


<syntaxhighlight lang="csharp">return Redirect("/home");</syntaxhighlight>
;RedirectToActionResult
RedirectToActionResult<br />
: Leitet zu einer spezifischen Action in einem Controller weiter.
Leitet zu einer spezifischen Action in einem Controller weiter.
<syntaxhighlight lang="csharp">
return RedirectToAction("Index", "Home");
</syntaxhighlight>


<syntaxhighlight lang="csharp">return RedirectToAction("Index", "Home");</syntaxhighlight>
;LocalRedirectResult
LocalRedirectResult<br />
: Leitet zu einer lokalen URL innerhalb der Anwendung weiter (Schutz vor Open Redirects).
Leitet zu einer lokalen URL innerhalb der Anwendung weiter (Schutz vor Open Redirects).
<syntaxhighlight lang="csharp">
return LocalRedirect("/products/details/1");
</syntaxhighlight>


<syntaxhighlight lang="csharp">return LocalRedirect("/products/details/1");</syntaxhighlight>
==== Statuscodes für Redirects ====
==== Statuscodes für Redirects ====
* **302 Found (Temporär)**: Standard. Ressource ist vorübergehend unter neuer URL.
* **302 Found (Temporär)**: Standard. Ressource ist vorübergehend unter neuer URL.
* **301 Moved Permanently**: Ressource wurde dauerhaft verschoben.
* **301 Moved Permanently**: Ressource wurde dauerhaft verschoben.
 
  * Verwendung: `RedirectPermanent`, `RedirectToActionPermanent`, `LocalRedirectPermanent`.
<code> * Verwendung: `RedirectPermanent`, `RedirectToActionPermanent`, `LocalRedirectPermanent`.</code>
==Weblinks==
 
== Weblinks ==
 
* https://learn.microsoft.com/de-de/aspnet/core/mvc/controllers/actions?view=aspnetcore-10.0
* https://learn.microsoft.com/de-de/aspnet/core/mvc/controllers/actions?view=aspnetcore-10.0


----
----
''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 17. Februar 2026, 13:05 Uhr

Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).


In der **Model-View-Controller (MVC)** Architektur fungieren Controller als Orchestratoren der Webanwendung. Sie verarbeiten eingehende HTTP-Anfragen, interagieren mit dem Model (Datenbank oder Business-Logik) und wählen die passende View für die Antwort aus.

  • **Controller**: Klassen, die verwandte Action Methods gruppieren. Sie befinden sich typischerweise im Ordner `Controllers`.
  • **Action Methods**: Öffentliche Methoden innerhalb eines Controllers, die spezifische Anfragen bearbeiten (z.B. Anzeigen einer Seite, Verarbeiten von Formulardaten).

Zweck

  • **Logik organisieren**: Controller bieten eine logische Gruppierung für Aktionen, die auf demselben Datentyp oder derselben Funktionalität arbeiten.
  • **Anfragen behandeln**: Sie sind verantwortlich für das Verarbeiten von Requests, das Abrufen notwendiger Daten und das Vorbereiten einer Antwort.
  • **Views auswählen**: Controller wählen oft die geeignete View zum Rendern aus und übergeben Daten (das Model) an die View.

Syntax und Konventionen

  • **Klassenbenennung**: Controller-Klassennamen sollten auf "Controller" enden (z.B. `HomeController`, `ProductsController`).
  • **Vererbung**: Controller erben von der Basisklasse `Controller` (oder `ControllerBase` für API-Controller).
  • **Action Method Benennung**: Methoden können jeden gültigen C#-Namen haben.
  • **Routing**: Routen können über Attribute wie `[Route]`, `[HttpGet]`, `[HttpPost]` definiert werden.

Code-Beispiel

// HomeController.cs
namespace ControllersExample.Controllers
{
    [Controller] // Markiert die Klasse als Controller
    public class HomeController : Controller
    {
        [Route("home")] // Route für diese Action
        public string Index()
        {
            return "Hello from Index";
        }

        [Route("contact-us/{mobile:regex(^\\d{10}$)}")] // Route mit Constraint
        public string Contact()
        {
            return "Hello from Contact";
        }
    }
}

Einrichtung in Program.cs

Um Controller zu verwenden, müssen sie registriert und dem Routing-System hinzugefügt werden:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(); // Aktiviert MVC Controller

var app = builder.Build();
app.UseRouting();
app.MapControllers(); // Verbindet Controller mit dem Routing-System
app.Run();

IActionResult

Das `IActionResult` Interface ist ein Kernkonzept in ASP.NET Core MVC. Es dient als Rückgabetyp für Action Methods und ermöglicht es, je nach Kontext der Anfrage unterschiedliche Arten von Antworten zurückzugeben.

Es definiert einen Vertrag mit einer einzigen Methode:

Task ExecuteResultAsync(ActionContext context);

Rückgabetypen (Action Results)

Hier sind die wichtigsten von `IActionResult` abgeleiteten Ergebnistypen:

ContentResult

Gibt rohen Inhalt (Text, HTML, JSON, etc.) zurück, ohne eine View zu rendern.

  • **Einsatz**: Einfache Textnachrichten, API-Antworten oder benutzerdefinierte Formate.
  • **Eigenschaften**: `Content` (Inhalt), `ContentType` (MIME-Type, z.B. `text/html`).
// Verwendung der Helper-Methode
public ContentResult Index()
{
    return Content("<h1>Welcome</h1>", "text/html");
}

JsonResult

Serialisiert ein Objekt in JSON-Format und gibt es zurück.

  • **Einsatz**: RESTful APIs, AJAX-Antworten.
  • **ContentType**: Setzt automatisch `application/json`.
public JsonResult Person()
{
    var person = new { FirstName = "James", LastName = "Smith", Age = 25 };
    return Json(person); // Helper-Methode
}

FileResult

Dient zum Senden von Dateien (PDF, Bilder, Dokumente) an den Client.

VirtualFileResult
Dient Dateien aus dem Web-Root (`wwwroot`) oder einem virtuellen Pfad.
return File("/sample.pdf", "application/pdf");
PhysicalFileResult
Dient Dateien von einem absoluten physischen Pfad auf dem Server. **Vorsicht**: Sicherheit beachten!
return PhysicalFile(@"c:\aspnetcore\sample.pdf", "application/pdf");
FileContentResult
Dient Dateien aus einem Byte-Array im Speicher.
byte[] bytes = System.IO.File.ReadAllBytes(@"c:\sample.pdf");
return File(bytes, "application/pdf");

Status Code Results

Ermöglicht das Senden standardisierter HTTP-Statuscodes, um den Client über das Ergebnis der Anfrage zu informieren.

  • **OkResult (200)**: Erfolgreiche Anfrage.
  • **BadRequestResult (400)**: Client-Fehler, z.B. ungültige Eingabe.
  • **NotFoundResult (404)**: Ressource nicht gefunden.
  • **UnauthorizedResult (401)**: Authentifizierung erforderlich.
  • **StatusCodeResult**: Jeder beliebige Statuscode.
public IActionResult GetBook(int id)
{
    if (id <= 0)
    {
        return BadRequest("Invalid ID"); // 400
    }
    
    if (id > 1000)
    {
        return NotFound("Book not found"); // 404
    }

    return Ok(); // 200
}

Redirect Results

Leitet den Browser zu einer anderen URL um.

RedirectResult
Leitet zu einer URL weiter (absolut oder relativ).
return Redirect("/home");
RedirectToActionResult
Leitet zu einer spezifischen Action in einem Controller weiter.
return RedirectToAction("Index", "Home");
LocalRedirectResult
Leitet zu einer lokalen URL innerhalb der Anwendung weiter (Schutz vor Open Redirects).
return LocalRedirect("/products/details/1");

Statuscodes für Redirects

  • **302 Found (Temporär)**: Standard. Ressource ist vorübergehend unter neuer URL.
  • **301 Moved Permanently**: Ressource wurde dauerhaft verschoben.
 * Verwendung: `RedirectPermanent`, `RedirectToActionPermanent`, `LocalRedirectPermanent`.

Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).