Wenn man beim erstellen eines Domainservices die Metadaten dazu erstellt, kann man sehr einfach per die Eigenschaften des Geschäftsobjekte deklarativ im Code mit Informationen versehen, die später zur Laufzeit ausgewertet werden. Also per <Attribut> Syntax.
Dadurch erhält man dann im Web Projekt Klassen in der Konvention DomainService1.metadata.vb. Im Code dieser Klasse kann dann per Annotation die Logik jeder Eigenschaft gesteuert werden. Folgendes lässt in einem Dataform das Feld Telefon erscheinen und es wird Fett dargestellt, da es ein muss Feld ist. Darüber erscheint es ziemlich weit oben.
<Required()>
<Display(Name:="Telefon", Order:=2)>
Public Property Phone As String
Was passiert nun wen Benutzer keine Telefonnummer angibt und das Feld leer lässt?
Natürlich kann man auch den Fehlertext noch ändern. Dazu einfach im Required ErrorMessage:= setzen. Diese Prüfung der Benutzereingabe findet Adhoc, also nach verlassen des Eingabefeldes statt. Ohne Interaktion zum Server.
Für komplexere Validierungen stellt Silverlight ein Benutzerdefinierte Prüfung sowohl am Client als auch am Server bereit. Dazu wird das entsprechende Property in der IRA DomainKlasse per Attribut Customvalidatiion dekoriert. Der erste Parameter stellt den Klassennamen dar und der zweite die Methode.
<CustomValidation(GetType(regeln), "hannesValid")>
Der Prüfcode muss eine gewissen Regelwerk folgen, sonst wird er schlicht nicht ausgeführt. Zunächst muss die Prüfroutine shared (c# static) sein. Die Rückgabe muss vom Typ Validationresult sein.
Imports System.ComponentModel.DataAnnotations
Public Class regeln
Public Shared Function hannesValid(ByVal region As String) As ValidationResult
If region.Length > 2 Then
Return New ValidationResult("nur 2 Zeichen")
End If
Return ValidationResult.Success
End Function
End Class
Das wird nun eine reine Prüfung am Server bewirken. Also erst wenn der Datensatz nach einer Änderung zurück geschrieben wird. Mit Hilfe von Shared Code kann diese Prüfung aber auch am Client sofort durchgeführt werden. Zeitpunkt ist wenn die Datenbindung aktualisiert wird, also bei LostFocus.
Die Prüfungsklasse muss nun in der Web Anwendung in einer eigenen Datei erstellt werden die der Namens Konvention shared.vb oder shared.cs folgt.
Der Code wird dann automatisch von Visual Studio 2010 auch in die Silverlight Anwendung “repliziert”.
In meinem Beispiel validiert laut debugger zwar die Silverlight Anwendung aber der Benutzer sieht keine Fehlermeldung. Das muss man erst über einen optionalen Parameter im ValidationResult ansteuern. Dabei wird der Feldname als Parameter angegeben, hier eben Region.
Public Shared Function hannesValid(ByVal region As String) As ValidationResult
If region.Length > 2 Then
Return New ValidationResult("nur 2 Zeichen", New String() {"Region"})
Denkbar ist auch, da als Array vorhanden, mehrere Felder anzugeben in der Form New String() {"Region", "Phone"})
Sinnvoller ist meines Erachtens einen universellen Silverlight Fehlerchecker zu haben. Dazu wird der Context des auslösenden Controls mitgebeben.
Public Class regeln
Public Shared Function hannesValid(ByVal region As String, ByVal ctx As ValidationContext) As ValidationResult
If region.Length > 2 Then
Return New ValidationResult("nur 2 Zeichen", New String() {ctx.MemberName})
Das alles und viel mehr lernt man in meine Silverlight Schulungen bei ppedv.