Webframeworkk/ASP.NET Core/Model Binding und Validation: Unterschied zwischen den Versionen
imported>Import Version 184 |
Die Seite wurde neu angelegt: „ Basierend auf der Analyse der Datei ''Text.txt'' bietet dieses Tutorial einen umfassenden Überblick über Model Binding und Validierung in ASP.NET Core MVC. == 1. Einführung in Model Binding == Model Binding ist eine leistungsstarke Funktion in ASP.NET Core MVC, die den Prozess der Datenextraktion aus verschiedenen Teilen einer HTTP-Anfrage (Formulardaten, Routenwerte, Query Strings) automatisiert und in stark typisierte C#-Objekte konvertiert, die di…“ |
||
| Zeile 1: | Zeile 1: | ||
''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).'' | ||
---- | ---- | ||
Basierend auf der Analyse der Datei ''Text.txt'' bietet dieses Tutorial einen umfassenden Überblick über Model Binding und Validierung in ASP.NET Core MVC. | Basierend auf der Analyse der Datei ''Text.txt'' bietet dieses Tutorial einen umfassenden Überblick über Model Binding und Validierung in ASP.NET Core MVC. | ||
== 1. Einführung in Model Binding == | == 1. Einführung in Model Binding == | ||
Model Binding ist eine leistungsstarke Funktion in ASP.NET Core MVC, die den Prozess der Datenextraktion aus verschiedenen Teilen einer HTTP-Anfrage (Formulardaten, Routenwerte, Query Strings) automatisiert und in stark typisierte C#-Objekte konvertiert, die direkt in Action-Methoden verwendet werden können. | Model Binding ist eine leistungsstarke Funktion in ASP.NET Core MVC, die den Prozess der Datenextraktion aus verschiedenen Teilen einer HTTP-Anfrage (Formulardaten, Routenwerte, Query Strings) automatisiert und in stark typisierte C#-Objekte konvertiert, die direkt in Action-Methoden verwendet werden können. | ||
=== Wann wird Model Binding ausgeführt? === | === Wann wird Model Binding ausgeführt? === | ||
Es findet statt, '''nachdem''' das Routing bestimmt hat, welche Action-Methode aufgerufen werden soll. Das System versucht dann, die Parameter dieser Methode mit Werten aus der eingehenden Anfrage zu füllen. | Es findet statt, '''nachdem''' das Routing bestimmt hat, welche Action-Methode aufgerufen werden soll. Das System versucht dann, die Parameter dieser Methode mit Werten aus der eingehenden Anfrage zu füllen. | ||
=== Reihenfolge des Model Bindings === | === Reihenfolge des Model Bindings === | ||
ASP.NET Core sucht in einer spezifischen Reihenfolge nach Datenquellen: | ASP.NET Core sucht in einer spezifischen Reihenfolge nach Datenquellen: | ||
# '''Form Data (POST requests)''': Werte aus HTML-Formularen. | # '''Form Data (POST requests)''': Werte aus HTML-Formularen. | ||
# '''Route Data''': Werte aus der URL-Routen-Vorlage (z.B. /products/{id}). | # '''Route Data''': Werte aus der URL-Routen-Vorlage (z.B. /products/{id}). | ||
# '''Query String''': Werte, die an die URL angehängt sind (nach dem ?). | # '''Query String''': Werte, die an die URL angehängt sind (nach dem ?). | ||
---- | |||
== 2. Datenquellen im Detail == | == 2. Datenquellen im Detail == | ||
=== Query Strings === | === Query Strings === | ||
* '''Zweck''': Übergabe von Parametern über die URL (z.B. Filtern, Sortieren). | * '''Zweck''': Übergabe von Parametern über die URL (z.B. Filtern, Sortieren). | ||
* '''Syntax''': ?key1=value1& | * '''Syntax''': ?key1=value1&key2=value2 | ||
* '''Best Practices''': Keine sensiblen Daten (Passwörter), einfache Namen verwenden, Input validieren. | * '''Best Practices''': Keine sensiblen Daten (Passwörter), einfache Namen verwenden, Input validieren. | ||
=== Route Data === | === Route Data === | ||
* '''Zweck''': Erfassen dynamischer Werte aus der URL. | * '''Zweck''': Erfassen dynamischer Werte aus der URL. | ||
* '''Syntax''': /products/{id}, wobei ''id'' ein Routenparameter ist. | * '''Syntax''': /products/{id}, wobei ''id'' ein Routenparameter ist. | ||
| Zeile 38: | Zeile 32: | ||
=== URL Encoding === | === URL Encoding === | ||
Spezielle Zeichen in URLs müssen encodiert werden (z.B. Leerzeichen als %20). Dies stellt sicher, dass URLs korrekt übertragen und interpretiert werden. | Spezielle Zeichen in URLs müssen encodiert werden (z.B. Leerzeichen als %20). Dies stellt sicher, dass URLs korrekt übertragen und interpretiert werden. | ||
---- | |||
== 3. Explizite Binding-Attribute == | == 3. Explizite Binding-Attribute == | ||
Obwohl das automatische Binding oft ausreicht, können Sie mit Attributen genau steuern, woher die Daten kommen sollen. | Obwohl das automatische Binding oft ausreicht, können Sie mit Attributen genau steuern, woher die Daten kommen sollen. | ||
* '''[FromQuery]''': Weist den Model Binder an, den Wert ausschließlich aus dem Query String zu holen. | * '''[FromQuery]''': Weist den Model Binder an, den Wert ausschließlich aus dem Query String zu holen. | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">public IActionResult Index([FromQuery] int page) { ... }</syntaxhighlight> | public IActionResult Index([FromQuery] int page) { ... } | ||
</syntaxhighlight> | |||
* '''[FromRoute]''': Weist den Model Binder an, den Wert aus den Routendaten zu holen. | * '''[FromRoute]''': Weist den Model Binder an, den Wert aus den Routendaten zu holen. | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">[Route("products/{id}")] | [Route("products/{id}")] | ||
public IActionResult Details([FromRoute] int id) { ... }</syntaxhighlight> | public IActionResult Details([FromRoute] int id) { ... } | ||
</syntaxhighlight> | |||
* '''[FromHeader]''': Bindet Parameter direkt aus HTTP-Headern (z.B. User-Agent). | * '''[FromHeader]''': Bindet Parameter direkt aus HTTP-Headern (z.B. User-Agent). | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">public IActionResult Index([FromHeader(Name = "User-Agent")] string userAgent) { ... }</syntaxhighlight> | public IActionResult Index([FromHeader(Name = "User-Agent")] string userAgent) { ... } | ||
</syntaxhighlight> | |||
* '''[FromBody]''': Wird verwendet, um komplexe Objekte aus dem Request Body zu binden (z.B. JSON oder XML). Dies ist besonders wichtig für APIs. | * '''[FromBody]''': Wird verwendet, um komplexe Objekte aus dem Request Body zu binden (z.B. JSON oder XML). Dies ist besonders wichtig für APIs. | ||
<syntaxhighlight lang="csharp"> | |||
public IActionResult Create([FromBody] Person person) { ... } | |||
</syntaxhighlight> | |||
---- | |||
== 4. Model Validierung == | == 4. Model Validierung == | ||
Model Validation prüft, ob die empfangenen Daten den definierten Kriterien entsprechen. Dies ist entscheidend für Sicherheit und Datenintegrität. | Model Validation prüft, ob die empfangenen Daten den definierten Kriterien entsprechen. Dies ist entscheidend für Sicherheit und Datenintegrität. | ||
=== Data Annotations === | === Data Annotations === | ||
Verwenden Sie Attribute aus ''System.ComponentModel.DataAnnotations'' direkt in Ihren Modellklassen: | Verwenden Sie Attribute aus ''System.ComponentModel.DataAnnotations'' direkt in Ihren Modellklassen: | ||
| Zeile 81: | Zeile 74: | ||
=== ModelState === | === ModelState === | ||
In Ihren Controller-Actions können Sie <code>ModelState.IsValid</code> prüfen. | In Ihren Controller-Actions können Sie <code>ModelState.IsValid</code> prüfen. | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">public IActionResult Create(Person person) | public IActionResult Create(Person person) | ||
{ | { | ||
if (!ModelState.IsValid) | if (!ModelState.IsValid) | ||
| Zeile 91: | Zeile 83: | ||
} | } | ||
// Speichern... | // Speichern... | ||
}</syntaxhighlight> | } | ||
</syntaxhighlight> | |||
=== Fortgeschrittene Validierung === | === Fortgeschrittene Validierung === | ||
# '''Custom Validation Attributes''': Erben Sie von <code>ValidationAttribute</code>, um eigene Regeln zu erstellen (z.B. DateRangeValidator oder MinimumYearValidator). Man überschreibt dabei die <code>IsValid</code>-Methode. | # '''Custom Validation Attributes''': Erben Sie von <code>ValidationAttribute</code>, um eigene Regeln zu erstellen (z.B. DateRangeValidator oder MinimumYearValidator). Man überschreibt dabei die <code>IsValid</code>-Methode. | ||
# '''IValidatableObject''': Für Validierung, die mehrere Eigenschaften betrifft (Cross-Property Validation), kann das Modell dieses Interface implementieren. Die <code>Validate</code>-Methode wird aufgerufen, nachdem die Property-Level-Validierungen durchgelaufen sind. | # '''IValidatableObject''': Für Validierung, die mehrere Eigenschaften betrifft (Cross-Property Validation), kann das Modell dieses Interface implementieren. Die <code>Validate</code>-Methode wird aufgerufen, nachdem die Property-Level-Validierungen durchgelaufen sind. | ||
---- | |||
== 5. Steuerung des Bindings == | == 5. Steuerung des Bindings == | ||
=== [Bind] und [BindNever] === | === [Bind] und [BindNever] === | ||
* '''[Bind]''': Gibt explizit an, welche Properties gebunden werden sollen (Whitelist). Schützt vor Overposting-Attacken. | * '''[Bind]''': Gibt explizit an, welche Properties gebunden werden sollen (Whitelist). Schützt vor Overposting-Attacken. | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">public IActionResult Create([Bind("Title", "Description")] Product product)</syntaxhighlight> | public IActionResult Create([Bind("Title", "Description")] Product product) | ||
</syntaxhighlight> | |||
* '''[BindNever]''': Schließt spezifische Properties vom Binding aus (Blacklist). Wird direkt an der Model-Property notiert. | * '''[BindNever]''': Schließt spezifische Properties vom Binding aus (Blacklist). Wird direkt an der Model-Property notiert. | ||
=== Collection Binding === | === Collection Binding === | ||
ASP.NET Core kann Listen und Arrays binden (List<T>, T[]). | |||
ASP.NET Core kann Listen und Arrays binden (List<T>, T[]). Das Namensschema im Request muss passen: | Das Namensschema im Request muss passen: | ||
* Indiziert: items[0], items[1] | * Indiziert: items[0], items[1] | ||
* Gleicher Name: items, items | * Gleicher Name: items, items | ||
---- | |||
== 6. Erweiterte Themen == | == 6. Erweiterte Themen == | ||
=== Input Formatters === | === Input Formatters === | ||
Verantwortlich für das Deserialisieren des Request Body (z.B. JSON zu C#-Objekt). | Verantwortlich für das Deserialisieren des Request Body (z.B. JSON zu C#-Objekt). | ||
* Standardmäßig ist ''NewtonsoftJsonInputFormatter'' oder ''SystemTextJsonInputFormatter'' aktiv. | * Standardmäßig ist ''NewtonsoftJsonInputFormatter'' oder ''SystemTextJsonInputFormatter'' aktiv. | ||
* Für XML kann ''XmlSerializerInputFormatter'' konfiguriert werden (<code>.AddXmlSerializerFormatters()</code>). | * Für XML kann ''XmlSerializerInputFormatter'' konfiguriert werden (<code>.AddXmlSerializerFormatters()</code>). | ||
=== Custom Model Binders === | === Custom Model Binders === | ||
Wenn das Standardverhalten nicht ausreicht, können Sie eigene Model Binder erstellen, indem Sie <code>IModelBinder</code> implementieren. | Wenn das Standardverhalten nicht ausreicht, können Sie eigene Model Binder erstellen, indem Sie <code>IModelBinder</code> implementieren. | ||
* '''BindModelAsync''': Enthält die Logik zum Auslesen der Daten aus dem <code>bindingContext</code>. | * '''BindModelAsync''': Enthält die Logik zum Auslesen der Daten aus dem <code>bindingContext</code>. | ||
* Ein <code>IModelBinderProvider</code> wird benötigt, um den Binder zu registrieren. | * Ein <code>IModelBinderProvider</code> wird benötigt, um den Binder zu registrieren. | ||
---- | |||
== Zusammenfassung == | == Zusammenfassung == | ||
# '''Model Binding''' automatisiert die Datenannahme und Typkonvertierung. | # '''Model Binding''' automatisiert die Datenannahme und Typkonvertierung. | ||
# '''Validierung''' stellt sicher, dass nur korrekte Daten verarbeitet werden (<code>ModelState.IsValid</code>). | # '''Validierung''' stellt sicher, dass nur korrekte Daten verarbeitet werden (<code>ModelState.IsValid</code>). | ||
Aktuelle Version vom 17. Februar 2026, 14:11 Uhr
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Basierend auf der Analyse der Datei Text.txt bietet dieses Tutorial einen umfassenden Überblick über Model Binding und Validierung in ASP.NET Core MVC.
1. Einführung in Model Binding
Model Binding ist eine leistungsstarke Funktion in ASP.NET Core MVC, die den Prozess der Datenextraktion aus verschiedenen Teilen einer HTTP-Anfrage (Formulardaten, Routenwerte, Query Strings) automatisiert und in stark typisierte C#-Objekte konvertiert, die direkt in Action-Methoden verwendet werden können.
Wann wird Model Binding ausgeführt?
Es findet statt, nachdem das Routing bestimmt hat, welche Action-Methode aufgerufen werden soll. Das System versucht dann, die Parameter dieser Methode mit Werten aus der eingehenden Anfrage zu füllen.
Reihenfolge des Model Bindings
ASP.NET Core sucht in einer spezifischen Reihenfolge nach Datenquellen:
- Form Data (POST requests): Werte aus HTML-Formularen.
- Route Data: Werte aus der URL-Routen-Vorlage (z.B. /products/{id}).
- Query String: Werte, die an die URL angehängt sind (nach dem ?).
2. Datenquellen im Detail
Query Strings
- Zweck: Übergabe von Parametern über die URL (z.B. Filtern, Sortieren).
- Syntax: ?key1=value1&key2=value2
- Best Practices: Keine sensiblen Daten (Passwörter), einfache Namen verwenden, Input validieren.
Route Data
- Zweck: Erfassen dynamischer Werte aus der URL.
- Syntax: /products/{id}, wobei id ein Routenparameter ist.
- Best Practices: Klare Namen wählen, Constraints verwenden (z.B. int, guid).
URL Encoding
Spezielle Zeichen in URLs müssen encodiert werden (z.B. Leerzeichen als %20). Dies stellt sicher, dass URLs korrekt übertragen und interpretiert werden.
3. Explizite Binding-Attribute
Obwohl das automatische Binding oft ausreicht, können Sie mit Attributen genau steuern, woher die Daten kommen sollen.
- [FromQuery]: Weist den Model Binder an, den Wert ausschließlich aus dem Query String zu holen.
public IActionResult Index([FromQuery] int page) { ... }
- [FromRoute]: Weist den Model Binder an, den Wert aus den Routendaten zu holen.
[Route("products/{id}")]
public IActionResult Details([FromRoute] int id) { ... }
- [FromHeader]: Bindet Parameter direkt aus HTTP-Headern (z.B. User-Agent).
public IActionResult Index([FromHeader(Name = "User-Agent")] string userAgent) { ... }
- [FromBody]: Wird verwendet, um komplexe Objekte aus dem Request Body zu binden (z.B. JSON oder XML). Dies ist besonders wichtig für APIs.
public IActionResult Create([FromBody] Person person) { ... }
4. Model Validierung
Model Validation prüft, ob die empfangenen Daten den definierten Kriterien entsprechen. Dies ist entscheidend für Sicherheit und Datenintegrität.
Data Annotations
Verwenden Sie Attribute aus System.ComponentModel.DataAnnotations direkt in Ihren Modellklassen:
- [Required]: Feld darf nicht null oder leer sein.
- [StringLength]: Beschränkt die Länge eines Strings.
- [Range]: Definiert einen numerischen Bereich.
- [EmailAddress]: Prüft auf gültiges E-Mail-Format.
- [Phone]: Prüft auf Telefonnummer-Format.
- [Compare]: Vergleicht zwei Eigenschaften (z.B. Passwort und Bestätigung).
- [Url]: Prüft auf gültige URL.
ModelState
In Ihren Controller-Actions können Sie ModelState.IsValid prüfen.
public IActionResult Create(Person person)
{
if (!ModelState.IsValid)
{
return View(person); // Fehler anzeigen
}
// Speichern...
}
Fortgeschrittene Validierung
- Custom Validation Attributes: Erben Sie von
ValidationAttribute, um eigene Regeln zu erstellen (z.B. DateRangeValidator oder MinimumYearValidator). Man überschreibt dabei dieIsValid-Methode. - IValidatableObject: Für Validierung, die mehrere Eigenschaften betrifft (Cross-Property Validation), kann das Modell dieses Interface implementieren. Die
Validate-Methode wird aufgerufen, nachdem die Property-Level-Validierungen durchgelaufen sind.
5. Steuerung des Bindings
[Bind] und [BindNever]
- [Bind]: Gibt explizit an, welche Properties gebunden werden sollen (Whitelist). Schützt vor Overposting-Attacken.
public IActionResult Create([Bind("Title", "Description")] Product product)
- [BindNever]: Schließt spezifische Properties vom Binding aus (Blacklist). Wird direkt an der Model-Property notiert.
Collection Binding
ASP.NET Core kann Listen und Arrays binden (List<T>, T[]). Das Namensschema im Request muss passen:
- Indiziert: items[0], items[1]
- Gleicher Name: items, items
6. Erweiterte Themen
Input Formatters
Verantwortlich für das Deserialisieren des Request Body (z.B. JSON zu C#-Objekt).
- Standardmäßig ist NewtonsoftJsonInputFormatter oder SystemTextJsonInputFormatter aktiv.
- Für XML kann XmlSerializerInputFormatter konfiguriert werden (
.AddXmlSerializerFormatters()).
Custom Model Binders
Wenn das Standardverhalten nicht ausreicht, können Sie eigene Model Binder erstellen, indem Sie IModelBinder implementieren.
- BindModelAsync: Enthält die Logik zum Auslesen der Daten aus dem
bindingContext. - Ein
IModelBinderProviderwird benötigt, um den Binder zu registrieren.
Zusammenfassung
- Model Binding automatisiert die Datenannahme und Typkonvertierung.
- Validierung stellt sicher, dass nur korrekte Daten verarbeitet werden (
ModelState.IsValid). - Nutzen Sie Attribute ([FromQuery], [FromBody], etc.) für explizite Kontrolle.
- Sicherheit ist Priorität: Validieren und sanitisieren Sie immer alle Inputs.
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).