Kurse:Model Binding

Aus ahrensburg.city
Version vom 23. Juni 2025, 09:39 Uhr von Thorsten (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Model Binding == '''Model Binding''' ist eine Funktion von ASP.NET Core, die Werte aus HTTP-Anfragen liest und sie als Argumente an die Aktionsmethode übergibt. === QueryString vs. RouteData === ==== [FromQuery] und [FromRoute] ==== '''[FromQuery]''' <syntaxhighlight lang="csharp"> // liest den Wert nur aus dem Query-String public IActionResult ActionMethodName( [FromQuery] type parameter) { } </syntaxhighlight> '''[FromRoute]''' <syntaxhighlight l…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Model Binding

Model Binding ist eine Funktion von ASP.NET Core, die Werte aus HTTP-Anfragen liest und sie als Argumente an die Aktionsmethode übergibt.

QueryString vs. RouteData

[FromQuery] und [FromRoute]

[FromQuery]

// liest den Wert nur aus dem Query-String
public IActionResult ActionMethodName( [FromQuery] type parameter)
{
}

[FromRoute]

// liest den Wert nur aus den Routenparametern
public IActionResult ActionMethodName( [FromRoute] type parameter)
{
}

Modelle

Ein Modell ist eine Klasse, die die Struktur von Daten (als Eigenschaften) darstellt, die Sie von der Anfrage empfangen und/oder an die Antwort senden möchten. Auch bekannt als POCO (Plain Old CLR Objects).

Modell

class ClassName
{
  public type PropertyName { get; set; }
}

form-urlencoded und form-data

form-urlencoded (Standard)

Request-Header

Content-Type: application/x-www-form-urlencoded

Request-Body

param1=value1&param2=value2

form-data

Request-Header

Content-Type: multipart/form-data

Request-Body

--------------------------d74496d66958873e
Content-Disposition: form-data; name="param1"
value1
--------------------------d74496d66958873e
Content-Disposition: form-data; name="param2"
value2

Modellvalidierung

class ClassName
{
  [Attribute] // wendet eine Validierungsregel auf diese Eigenschaft an
  public type PropertyName { get; set; }
}

ModelState

  • IsValid: Gibt an, ob mindestens ein Validierungsfehler vorliegt oder nicht (true oder false).
  • Values: Enthält den Wert jeder Modelleigenschaft mit der entsprechenden "Errors"-Eigenschaft, die eine Liste der Validierungsfehler dieser Modelleigenschaft enthält.
  • ErrorCount: Gibt die Anzahl der Fehler zurück.

Validierungsattribute

[Required(ErrorMessage = "Wert")]
Gibt an, dass der Eigenschaftswert erforderlich ist (darf nicht leer oder null sein).
[StringLength(int maximumLength, MinimumLength = Wert, ErrorMessage = "Wert")]
Gibt die minimale und maximale Länge (Anzahl der Zeichen) an, die in der Zeichenfolge zulässig ist.
[Range(int minimum, int maximum, ErrorMessage = "Wert")]
Gibt den minimal und maximal zulässigen numerischen Wert an.
[RegularExpression(string pattern, ErrorMessage = "Wert")]
Gibt das gültige Muster (regulärer Ausdruck) an.
[EmailAddress(ErrorMessage = "Wert")]
Gibt an, dass der Wert eine gültige E-Mail-Adresse sein muss.
[Phone(ErrorMessage = "Wert")]
Gibt an, dass der Wert eine gültige Telefonnummer sein muss. Bsp.: (999)-999-9999 oder 9876543210
[Compare(string otherProperty, ErrorMessage = "Wert")]
Gibt an, dass die Werte der aktuellen Eigenschaft und einer anderen Eigenschaft übereinstimmen müssen.
[Url(ErrorMessage = "Wert")]
Gibt an, dass der Wert eine gültige URL (Website-Adresse) sein muss. Bsp.: http://www.example.com
[ValidateNever]
Gibt an, dass die Eigenschaft nicht validiert werden soll (schließt die Eigenschaft von der Modellvalidierung aus).

Benutzerdefinierte Validierungen

class ClassName : ValidationAttribute
{
  public override ValidationResult? IsValid(object? value, ValidationContext validationContext)
  {
    // return ValidationResult.Success;
    // [oder] return new ValidationResult("Fehlermeldung");
  }
}
  • ValidationAttribute: Basisklasse für alle Validierungsattribute wie RequiredAttribute, RegularExpressionAttribute, RangeAttribute, StringLengthAttribute, CompareAttribute usw. Stellt Eigenschaften wie ErrorMessage & Methoden wie Validate(), IsValid() etc. bereit.
  • ValidationContext: Dient als Parameter für die IsValid()-Methode von benutzerdefinierten Validierungsattribut-Klassen. Stellt Eigenschaften wie ObjectType, ObjectInstance bereit.

Benutzerdefinierte Validierungen mit mehreren Eigenschaften

IValidatableObject

class ClassName : IValidatableObject
{
  // Modelleigenschaften hier
 
  public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
  {
    if (Bedingung)
    {
      yield return new ValidationResult("Fehlermeldung");
    }
  }
}
  • IValidatableObject: Basis-Interface für Modellklassen mit Validierung. Stellt eine Methode namens Validate() zur Verfügung, um Validierungslogik auf Klassenebene zu definieren. Die Validate()-Methode wird ausgeführt, nachdem alle Validierungen auf Eigenschaftsebene ausgeführt wurden; sie wird jedoch nicht ausgeführt, wenn mindestens eine Validierung auf Eigenschaftsebene einen Fehler ergibt.
  • ValidationContext: Dient als Parameter für die Validate()-Methode von Modellklassen, die IValidatableObject implementieren. Stellt Eigenschaften wie ObjectType, ObjectInstance bereit.

[Bind] und [BindNever]

[Bind]

class ClassNameController
{
  public IActionResult ActionMethodName( [Bind(nameof(ClassName.PropertyName), nameof(ClassName.PropertyName) )]  ClassName parameterName)
  {
  }
}

Das [Bind]-Attribut gibt an, dass nur die angegebenen Eigenschaften in die Modellbindung einbezogen werden sollen. Verhindert Over-Posting (das Senden von Werten an unerwartete Eigenschaften), insbesondere in "Create"-Szenarien.

[BindNever]

class ModelClassName
{
  [BindNever]
  public type PropertyName { get; set; }
}

Das [BindNever]-Attribut gibt an, dass die angegebene Eigenschaft NICHT in die Modellbindung einbezogen werden soll. Nützlich, wenn Sie weniger Eigenschaften von der Modellbindung ausschließen müssen.

[FromBody]

// ermöglicht es den Input-Formattern, Daten nur aus dem Request-Body (als JSON, XML oder benutzerdefiniert) zu lesen
public IActionResult ActionMethodName( [FromBody] type parameter)
{
}

Input-Formatter

Benutzerdefinierte Model-Binder

Benutzerdefinierter Model-Binder

class ClassName : IModelBinder
{
  public Task BindModelAsync(ModelBindingContext bindingContext)
  {
    // liest den Wert aus der Anfrage
    bindingContext.ValueProvider.GetValue("FirstName");
 
    // gibt das Modellobjekt zurück, nachdem die Daten aus der Anfrage gelesen wurden
    bindingContext.Result = ModelBindingResult.Success(your_object);
  }
}
  • IModelBinder: Basis-Interface für alle benutzerdefinierten Model-Binder. Stellt eine Methode namens BindModelAsync zur Verfügung, um die Logik für das Binden (Lesen) von Daten aus der Anfrage und das Erstellen eines Modellobjekts zu definieren, das als Parameter in der Aktionsmethode empfangen wird.
  • ModelBindingContext: Dient als Parameter für die BindModelAsync()-Methode von benutzerdefinierten Model-Binder-Klassen. Stellt Eigenschaften wie HttpContext, ModelState, ValueProvider, Result etc. bereit.

Benutzerdefinierte Model-Binder-Provider

class ClassName : IModelBinderProvider
{
  public IModelBinder GetBinder(ModelBinderProviderContext providerContext)
  {
    // gibt den Typ der aufzurufenden benutzerdefinierten Model-Binder-Klasse zurück
    return new BinderTypeModelBinder(typeof(YourModelBinderClassName));
  }
}
  • IModelBinderProvider: Basis-Interface für alle benutzerdefinierten Model-Binder-Provider. Stellt eine Methode namens GetBinder zur Verfügung, um den Typ der benutzerdefinierten Model-Binder-Klasse zurückzugeben.
  • ModelBinderProviderContext: Dient als Parameter für die GetBinder()-Methode von benutzerdefinierten Model-Binder-Provider-Klassen. Stellt Eigenschaften wie BindingInfo, Services etc. bereit.