これもチェックしてください:
ASP.NET MVC 3 での検証の完全ガイド - パート 2
記事の主要部分は次のとおりです (コピペ)。
クライアントとサーバーの両方で機能する完全に機能するカスタム バリデータを作成するには、4 つの異なる部分があります。まずValidationAttribute
、サーバー側の検証ロジックをサブクラス化して追加します。次に、属性に実装IClientValidatable
して、HTML5data-*
属性をクライアントに渡すことができるようにします。3 番目に、クライアントで検証を実行するカスタム JavaScript 関数を作成します。最後に、HTML5 属性をカスタム関数が理解できる形式に変換するアダプターを作成します。これは大変な作業のように思えますが、一度始めると、比較的簡単であることがわかります。
ValidationAttribute のサブクラス化
この例では、あるプロパティの値が別のプロパティの値と等しくないことを単純にチェックする NotEqualTo バリデータを記述します。
[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;
}
}
RegisterModel の password プロパティに新しい属性を追加し、アプリケーションを実行します。
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[NotEqualTo("UserName")]
public string Password { get; set; }
...
IClientValidatable の実装
ASP.NET MVC 2 には、クライアント側の検証を追加するメカニズムがありましたが、あまりきれいではありませんでした。ありがたいことに、MVC 3 では状況が改善され、プロセスはかなり簡単になりました。ありがたいことに、以前のバージョンの as を変更する必要はありません。Global.asax
最初のステップは、カスタム検証属性が IClientValidatable を実装することです。これは単純な 1 つのメソッド インターフェイスです。
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 };
}
ここでアプリケーションを実行してソースを表示すると、パスワード入力 html に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>
カスタム jQuery 検証関数の作成
このコードはすべて、別の JavaScript ファイルに配置することをお勧めします。
(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));
検証要件によっては、検証自体に必要なコードが jquery.validate ライブラリに既に含まれている場合があります。jquery.validate には、実装されていない、またはデータ注釈にマップされていないバリデーターがたくさんあるため、これらがニーズを満たす場合、javascript で記述する必要があるのは、アダプターまたは組み込みアダプターへの呼び出しだけです。わずか 1 行であること。jquery.validate.jsの内部を調べて、利用可能なものを見つけてください。
既存の jquery.validate.unobtrusive アダプターの使用
アダプターの仕事は、フォーム要素の HTML5data-*
属性を読み取り、このデータを jquery.validate とカスタム検証関数が理解できるフォームに変換することです。ただし、すべての作業を自分で行う必要はありません。多くの場合、組み込みアダプターを呼び出すことができます。jquery.validate.unobtrusive は、ほとんどの状況で使用できる 3 つの組み込みアダプターを宣言します。これらは:
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.
バリデーターがこれらのカテゴリーのいずれにも当てはまらない場合は、jQuery.validator.unobtrusive.adapters.add
メソッドを使用して独自のアダプターを作成する必要があります。これは思ったほど難しくはありません。この記事の後半で例を示します。
メソッドを使用してaddSingleVal
、アダプタの名前と渡したい単一の値の名前を渡します。検証関数の名前がアダプターと異なる場合は、3 番目のパラメーター ( ruleName
)を渡すことができます。
jQuery.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty", "mynotequaltofunction");
この時点で、カスタム バリデータは完成です。
理解を深めるために、より詳細な説明とより複雑な例を示す記事自体を参照してください。
HTH。