Überprüfen Sie dies auch:
Das vollständige Handbuch zur Validierung in ASP.NET MVC 3 - Teil 2
Hauptteile des Artikels folgen (kopiert).
Das Erstellen eines voll funktionsfähigen benutzerdefinierten Validators, der sowohl auf dem Client als auch auf dem Server funktioniert, besteht aus vier Teilen. Zuerst unterklassifizieren wir ValidationAttribute
unsere serverseitige Validierungslogik und fügen sie hinzu. Als nächstes implementieren wir IClientValidatable
unser Attribut, damit HTML5- data-*
Attribute an den Client übergeben werden können. Drittens schreiben wir eine benutzerdefinierte JavaScript-Funktion, die die Validierung auf dem Client durchführt. Schließlich erstellen wir einen Adapter, um die HTML5-Attribute in ein Format umzuwandeln, das unsere benutzerdefinierte Funktion verstehen kann. Das klingt nach viel Arbeit, aber sobald Sie anfangen, werden Sie es relativ einfach finden.
Unterklasse ValidationAttribute
In diesem Beispiel schreiben wir einen NotEqualTo-Validator, der einfach überprüft, ob der Wert einer Eigenschaft nicht dem Wert einer anderen entspricht.
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class NotEqualToAttribute : ValidationAttribute
{
private const string DefaultErrorMessage = "{0} cannot be the same as {1}.";
public string OtherProperty { get; private set; }
public NotEqualToAttribute(string otherProperty)
: base(DefaultErrorMessage)
{
if (string.IsNullOrEmpty(otherProperty))
{
throw new ArgumentNullException("otherProperty");
}
OtherProperty = otherProperty;
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, OtherProperty);
}
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
if (value != null)
{
var otherProperty = validationContext.ObjectInstance.GetType()
.GetProperty(OtherProperty);
var otherPropertyValue = otherProperty
.GetValue(validationContext.ObjectInstance, null);
if (value.Equals(otherPropertyValue))
{
return new ValidationResult(
FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
}
Fügen Sie das neue Attribut der Kennworteigenschaft des RegisterModels hinzu und führen Sie die Anwendung aus.
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[NotEqualTo("UserName")]
public string Password { get; set; }
...
Implementierung von IClientValidatable
ASP.NET MVC 2 hatte einen Mechanismus zum Hinzufügen einer clientseitigen Validierung, der jedoch nicht sehr hübsch war. Zum Glück haben sich die Dinge in MVC 3 verbessert und der Prozess ist jetzt ziemlich trivial und beinhaltet zum Glück keine Änderung des Global.asax
wie in der vorherigen Version.
Der erste Schritt besteht darin, dass Ihr benutzerdefiniertes Validierungsattribut IClientValidatable implementiert. Dies ist eine einfache Schnittstelle mit einer Methode:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata,
ControllerContext context)
{
var clientValidationRule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "notequalto"
};
clientValidationRule.ValidationParameters.Add("otherproperty", OtherProperty);
return new[] { clientValidationRule };
}
Wenn Sie die Anwendung jetzt ausführen und die Quelle anzeigen, sehen Sie, dass der HTML-Code für die Passworteingabe jetzt Ihre Datenattribute enthält notequalto
:
<div class="editor-field">
<input data-val="true" data-val-notequalto="Password cannot be the same as UserName."
data-val-notequalto-otherproperty="UserName"
data-val-regex="Weak password detected."
data-val-regex-pattern="^(?!password$)(?!12345$).*"
data-val-required="The Password field is required."
id="Password" name="Password" type="password" />
<span class="hint">Enter your password here</span>
<span class="field-validation-valid" data-valmsg-for="Password"
data-valmsg-replace="true"></span>
</div>
Erstellen einer benutzerdefinierten jQuery-Validierungsfunktion
Der gesamte Code sollte am besten in einer separaten JavaScript-Datei abgelegt werden.
(function ($) {
$.validator.addMethod("notequalto", function (value, element, params) {
if (!this.optional(element)) {
var otherProp = $('#' + params);
return (otherProp.val() !=
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty");
}(jQuery));
Abhängig von Ihren Validierungsanforderungen stellen Sie möglicherweise fest, dass die Bibliothek jquery.validate bereits den Code enthält, den Sie für die Validierung selbst benötigen. In jquery.validate gibt es viele Validatoren, die nicht implementiert oder Datenanmerkungen zugeordnet wurden. Wenn diese also Ihren Anforderungen entsprechen, müssen Sie nur einen Adapter oder sogar einen Aufruf eines integrierten Adapters schreiben, der dies kann sei so klein wie eine einzelne Zeile. Schauen Sie sich jquery.validate.js an nach, um herauszufinden, was verfügbar ist.
Verwenden eines vorhandenen Adapters jquery.validate.unobtrusive
Die Aufgabe des Adapters besteht darin, die HTML5- data-*
Attribute Ihres Formularelements zu lesen und diese Daten in ein Formular zu konvertieren, das von jquery.validate und Ihrer benutzerdefinierten Validierungsfunktion verstanden werden kann. Sie müssen jedoch nicht die ganze Arbeit selbst erledigen, und in vielen Fällen können Sie einen eingebauten Adapter aufrufen. jquery.validate.unobtrusive deklariert drei integrierte Adapter, die in den meisten Situationen verwendet werden können. Diese sind:
jQuery.validator.unobtrusive.adapters.addBool - used when your validator does not need any additional data.
jQuery.validator.unobtrusive.adapters.addSingleVal - used when your validator takes in one piece of additional data.
jQuery.validator.unobtrusive.adapters.addMinMax - used when your validator deals with minimum and maximum values such as range or string length.
Wenn Ihr Validator nicht in eine dieser Kategorien passt, müssen Sie mit der jQuery.validator.unobtrusive.adapters.add
Methode Ihren eigenen Adapter schreiben . Dies ist nicht so schwierig, wie es sich anhört, und wir werden später in diesem Artikel ein Beispiel sehen.
Wir verwenden die addSingleVal
Methode, indem wir den Namen des Adapters und den Namen des einzelnen Werts übergeben, den wir übergeben möchten. Sollte sich der Name der Validierungsfunktion vom Adapter unterscheiden, können Sie einen dritten Parameter ( ruleName
) übergeben:
jQuery.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty", "mynotequaltofunction");
Zu diesem Zeitpunkt ist unser benutzerdefinierter Validator abgeschlossen.
Zum besseren Verständnis lesen Sie den Artikel selbst, der eine ausführlichere Beschreibung und ein komplexeres Beispiel enthält.
HTH.