ASP.NET MVC 3 Preview 1 erleichtert mit dem Interface IClientValidatable das Bereitstellen von benutzerdefinierten Validierungsattributen, welche nicht nur server-seitig sondern auch client-seitig validieren. Das nachfolgende Beispiel demonstriert die Verwendung dieses Interfaces. Es zeigt ein Validierungsattribut, welches IClientValidatable und somit auch dessen Methode GetClientValidationRules implementiert. Die Aufgabe dieser Methode besteht im Bereitstellen von ModelClientValidationRule-Instanzen, wobei jede dieser Instanzen eine auszuführende javascript-basierte Validierungs-Routine beschreibt. Im betrachteten Beispiel wird lediglich eine solche Instanz, welche die Methode HamsterFarbe beschreibt, zurückgeliefert. Zusätzlich wird eine Fehlermeldung (ErrorMessage) sowie ein Wert für den benutzerdefinierten Parameter autocorrect hinterlegt.
public class HamsterFarbeValidationAttribute : ValidationAttribute, IClientValidatable
{
// Client-seitige Validierung
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = "Aber Krümel ist doch ein Goldhamster !!!",
ValidationType = "HamsterFarbe"
};
rule.ValidationParameters.Add("autocorrect", true);
// Für weitere Infos siehe Nils Holgersson
yield return rule;
}
// Server-seitige Validierung
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
Hamster h = validationContext.ObjectInstance as Hamster;
int FarbeId = (int) value;
if (h.Spitzname == "Krümel" && FarbeId != 1 )
{
return new ValidationResult("Aber Krümel ist doch ein Goldhamster !!");
}
return ValidationResult.Success;
}
}
In den zu validierenden Views sind, wie nachfolgend gezeigt, zusätzlich die entsprechenden Java Script-Libraries einzubinden. Zusätzlich muss über das Dictionary Sys.Mvc.ValidatorRegistry.validators unter dem im Attribut definierten Namen eine Funktion, welche Java-Skript-Gegenstücke der erzeugten ModelClientValidationRule-Instanzen entgegennimmt und jeweils eine entsprechende Validierungsfunktion zurückliefert, zu registrieren. Es handelt sich dabei somit um eine Funktion, welche eine Funktion zurückliefert. Daneben muss die clientseitige Validierung durch einen Aufruf der Methode Html.EnableClientValidation aktiviert werden.
<script src="../../Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftAjax.debug.js"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftMvcValidation.debug.js"></script>
<script type="text/javascript">
Sys.Mvc.ValidatorRegistry.validators["HamsterFarbe"] = function (rule) {
var autocorrect = rule.ValidationParameters["autocorrect"];
return function (value, context) {
var name = $("#Spitzname").val();
var info = "";
if (name == "Krümel" && value != 1) {
if (autocorrect) {
$("#FarbeId").val(1);
info = "\nDer Wert wurde automatisch korrigiert!";
}
return rule.ErrorMessage + info;
}
return true;
};
};
</script>
<% Html.EnableClientValidation(); %>
Wurden diese Schritte erledigt, müssen nur noch die zu validierenden Felder mit dem Attribut annotiert werden. Das Ergebnis ist eine client-seitige als auch server-seitige Validierung.
public class Hamster {
[HamsterFarbeValidation]
public int FarbeId
{
get;
set;
}
}
Zum Vergleicht beschreibt [1] die etwas aufwändigere Vorgehensweise, die in MVC 2 notwendig war und in MVC 3 als Alternative zur hier beschriebenen weiterhin existiert.
[1] http://msdn.microsoft.com/en-us/library/ff398048.aspx