|
|
| Zeile 1: |
Zeile 1: |
| == Model Binding ==
| | Der Alfred-Rust-Saal befindet sich in der Adresse Wulfsdorfer Weg 71, 22926 Ahrensburg. |
| '''Model Binding''' ist eine Funktion von ASP.NET Core, die Werte aus HTTP-Anfragen liest und sie als Argumente an die Aktionsmethode übergibt.
| | Er ist ein zentraler Ort für Theater, Musik, Events und Vorträge. Der Saal hat 462 Plätze. Die Gesamtfläche beträgt 441m². |
| | | ==Weblink== |
| === QueryString vs. RouteData ===
| | * https://www.ahrensburg.de/Bildung-Kultur/Kulturelle-Einrichtungen/Alfred-Rust-Saal/ |
| ==== [FromQuery] und [FromRoute] ====
| | * https://theater-und-musik-in-ahrensburg.de/ |
| | |
| '''[FromQuery]'''
| |
| <syntaxhighlight lang="csharp">
| |
| // liest den Wert nur aus dem Query-String
| |
| public IActionResult ActionMethodName( [FromQuery] type parameter)
| |
| {
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| '''[FromRoute]'''
| |
| <syntaxhighlight lang="csharp">
| |
| // liest den Wert nur aus den Routenparametern
| |
| public IActionResult ActionMethodName( [FromRoute] type parameter)
| |
| {
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| === 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 ====
| |
| <syntaxhighlight lang="csharp">
| |
| class ClassName
| |
| {
| |
| public type PropertyName { get; set; }
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| === form-urlencoded und form-data ===
| |
| ==== form-urlencoded (Standard) ====
| |
| '''Request-Header'''
| |
| <pre>
| |
| Content-Type: application/x-www-form-urlencoded
| |
| </pre>
| |
| | |
| '''Request-Body'''
| |
| <pre>
| |
| param1=value1¶m2=value2
| |
| </pre>
| |
| | |
| ==== form-data ====
| |
| '''Request-Header'''
| |
| <pre>
| |
| Content-Type: multipart/form-data
| |
| </pre>
| |
| | |
| '''Request-Body'''
| |
| <pre>
| |
| --------------------------d74496d66958873e
| |
| Content-Disposition: form-data; name="param1"
| |
| value1
| |
| --------------------------d74496d66958873e
| |
| Content-Disposition: form-data; name="param2"
| |
| value2
| |
| </pre>
| |
| | |
| === Modellvalidierung ===
| |
| <syntaxhighlight lang="csharp">
| |
| class ClassName
| |
| {
| |
| [Attribute] // wendet eine Validierungsregel auf diese Eigenschaft an
| |
| public type PropertyName { get; set; }
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| ==== ModelState ====
| |
| * '''IsValid''': Gibt an, ob mindestens ein Validierungsfehler vorliegt oder nicht (<code>true</code> oder <code>false</code>).
| |
| * '''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.: <code>(999)-999-9999</code> oder <code>9876543210</code>
| |
| | |
| ; [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.: <code>http://www.example.com</code>
| |
| | |
| ; [ValidateNever]
| |
| : Gibt an, dass die Eigenschaft nicht validiert werden soll (schließt die Eigenschaft von der Modellvalidierung aus).
| |
| | |
| === Benutzerdefinierte Validierungen === | |
| <syntaxhighlight lang="csharp">
| |
| class ClassName : ValidationAttribute
| |
| {
| |
| public override ValidationResult? IsValid(object? value, ValidationContext validationContext)
| |
| {
| |
| // return ValidationResult.Success;
| |
| // [oder] return new ValidationResult("Fehlermeldung");
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| * '''ValidationAttribute''': Basisklasse für alle Validierungsattribute wie <code>RequiredAttribute</code>, <code>RegularExpressionAttribute</code>, <code>RangeAttribute</code>, <code>StringLengthAttribute</code>, <code>CompareAttribute</code> usw. Stellt Eigenschaften wie <code>ErrorMessage</code> & Methoden wie <code>Validate()</code>, <code>IsValid()</code> etc. bereit. | |
| | |
| * '''ValidationContext''': Dient als Parameter für die <code>IsValid()</code>-Methode von benutzerdefinierten Validierungsattribut-Klassen. Stellt Eigenschaften wie <code>ObjectType</code>, <code>ObjectInstance</code> bereit.
| |
| | |
| ==== Benutzerdefinierte Validierungen mit mehreren Eigenschaften ====
| |
| ==== IValidatableObject ====
| |
| <syntaxhighlight lang="csharp">
| |
| class ClassName : IValidatableObject
| |
| {
| |
| // Modelleigenschaften hier
| |
|
| |
| public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
| |
| {
| |
| if (Bedingung)
| |
| {
| |
| yield return new ValidationResult("Fehlermeldung");
| |
| }
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| * '''IValidatableObject''': Basis-Interface für Modellklassen mit Validierung. Stellt eine Methode namens <code>Validate()</code> zur Verfügung, um Validierungslogik auf Klassenebene zu definieren. Die <code>Validate()</code>-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 <code>Validate()</code>-Methode von Modellklassen, die <code>IValidatableObject</code> implementieren. Stellt Eigenschaften wie <code>ObjectType</code>, <code>ObjectInstance</code> bereit.
| |
| | |
| === [Bind] und [BindNever] ===
| |
| ==== [Bind] ====
| |
| <syntaxhighlight lang="csharp">
| |
| class ClassNameController
| |
| {
| |
| public IActionResult ActionMethodName( [Bind(nameof(ClassName.PropertyName), nameof(ClassName.PropertyName) )] ClassName parameterName)
| |
| {
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| 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] ====
| |
| <syntaxhighlight lang="csharp">
| |
| class ModelClassName
| |
| {
| |
| [BindNever]
| |
| public type PropertyName { get; set; }
| |
| }
| |
| </syntaxhighlight>
| |
| 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] ===
| |
| <syntaxhighlight lang="csharp">
| |
| // 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)
| |
| {
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| === Input-Formatter ===
| |
| | |
| === Benutzerdefinierte Model-Binder ===
| |
| ==== Benutzerdefinierter Model-Binder ====
| |
| <syntaxhighlight lang="csharp">
| |
| 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);
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| * '''IModelBinder''': Basis-Interface für alle benutzerdefinierten Model-Binder. Stellt eine Methode namens <code>BindModelAsync</code> 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 <code>BindModelAsync()</code>-Methode von benutzerdefinierten Model-Binder-Klassen. Stellt Eigenschaften wie <code>HttpContext</code>, <code>ModelState</code>, <code>ValueProvider</code>, <code>Result</code> etc. bereit.
| |
| | |
| ==== Benutzerdefinierte Model-Binder-Provider ====
| |
| <syntaxhighlight lang="csharp">
| |
| class ClassName : IModelBinderProvider
| |
| {
| |
| public IModelBinder GetBinder(ModelBinderProviderContext providerContext)
| |
| {
| |
| // gibt den Typ der aufzurufenden benutzerdefinierten Model-Binder-Klasse zurück
| |
| return new BinderTypeModelBinder(typeof(YourModelBinderClassName));
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| * '''IModelBinderProvider''': Basis-Interface für alle benutzerdefinierten Model-Binder-Provider. Stellt eine Methode namens <code>GetBinder</code> zur Verfügung, um den Typ der benutzerdefinierten Model-Binder-Klasse zurückzugeben.
| |
| | |
| * '''ModelBinderProviderContext''': Dient als Parameter für die <code>GetBinder()</code>-Methode von benutzerdefinierten Model-Binder-Provider-Klassen. Stellt Eigenschaften wie <code>BindingInfo</code>, <code>Services</code> etc. bereit.
| |