RSS FeedFeed TwitterTwitter XINGXING
  
Meine Bücher

Erscheint demnächst: Verteilte Systeme und Services mit .NET 4.5: Konzepte und Lösungen für WCF 4.5 und ASP.NET Web-API ,
Hanser Fachbuchverlag

Weitere Infos

 

.NET 4.5 Update,
Microsoft Press

Weitere Infos

 

Verteilte Systeme und Services mit .NET 4.0: Konzepte und Lösungen mit WCF 4.0,
Hanser Fachbuchverlag

Weitere Infos

 
Weitere Bücher
Meine Artikel

Leichtgewichtige Kommunikation: REST-basierte Services mit dem neuen API aus der ASP.NET-Familie,
windows.developer

Weitere Infos

 

Windows Azure Tutorial, Teil 3: Verbindung zwischen Cloud- und lokalen Applikationen,
iX - Magazin für professionelle Informationstechnik

Weitere Infos

 

Weitere Artikel

Schulung & Beratung

Gemeinsam mit meinen Kollegen aus dem IT-Visions Netzwerk unterstützte ich durch zielgerichtete Inhouse-Trainings und Consulting Unternehmen bei der Planung und Umsetzung großer Software-Systeme mit der Microsoft/.NET-Plattform.

 
Konferenzen

Scandinavian Developer Conference 2013 (SDC 2013) von 04.03.2013 bis 06.03.2013 in Göteborg

Meine Talks

Web-Site der Konferenz

 

BASTA! on Tour Spring 2013 von 24.04.2013 bis 26.04.2013 in Düsseldorf

Meine Talks

Web-Site der Konferenz

 

5th SOA and Cloud-Technology Symposium 2012 von 24.09.2012 bis 25.09.2012 in London

Meine Talks

Web-Site der Konferenz

 
Weitere Konferenzen
von Manfred, 29. November 2010 10:39

Achtung: Dieser Beitrag geht davon aus, dass die ab der finalen Version von ASP.NET MVC 3 standardmäßig verwendete "unobstrusive" Validation NICHT verwendet wird. Falls dies doch der Fall ist (was in den meisten Fällen sinnvoll sein dürfte), weicht die Vorgehensweise von der hier beschriebenen etwas ab. Informationen dazu finden sich hier.

Zur Verbesserung der Benutzerfreundlichkeit erlaubt ASP.NET MVC das Bereitstellen von clientseitigen auf JavaScript basierenden Validierungsroutinen, die ergänzend zur serverseitigen Validierung ausgeführt werden. Durch Unterstützung des Interfaces IClientValidatable wird solch ein Vorhaben ab Version 3 erleichtert.

Das nachfolgende Listing demonstriert die Verwendung dieses Interfaces. Es zeigt ein Validierungsattribut, das IClientValidatable und damit 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 eine solche Instanz, die auf die Methode HamsterFarbe verweist, 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;
    }

    [...]

In den zu validierenden Views sind, wie nachfolgend gezeigt, zusätzlich die entsprechenden JavaScript-Libraries einzubinden. Daneben wird im Dictionary Sys.Mvc.ValidatorRegistry.validators unter dem im Validierungs-Attribut definierten Namen eine JavaScript-Methode hinterlegt. Diese nimmt ein JavaScript-Gegenstück der jeweiligen ModelClientValidationRule-Instanz entgegen und liefert eine dazu passende Validierungsfunktion zurück. Es handelt sich somit um eine Funktion, die eine Validierungsfunktion liefert. Zusätzlich ist die clientseitige Validierung, wie bereits in der Vorgängerversion, durch einen Aufruf der Methode Html.EnableClientValidation zu aktivieren.

<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">
    // Funktion HamsterFarbe
    Sys.Mvc.ValidatorRegistry.validators["HamsterFarbe"] = function (rule) {
        var autocorrect = rule.ValidationParameters["autocorrect"];
        // Zurückgeliefert wird die zu verwendende Validierungs-Funktion
        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(); }

Wird das Validierungsattribut nun, wie im nachfolgenden Listing gezeigt, angewandt, kommt man in den Genuss einer client-seitigen Validierung, welche bekanntlich aus Sicherheitsgründen nur eine Ergänzung zu und kein Ersatz für entsprechende Server-seitige Validierungen darstellt.

class Hamster {
    [HamsterFarbeValidation]
    public int FarbeId { get; set; }
}

Kategorien: ASP.NET MVC