データベースに保存されているメタデータを調べて検証するカスタム検証属性を作成できます。カスタム検証属性は簡単に作成でき、メソッドを拡張System.ComponentModel.DataAnnotations.ValidationAttribute
してオーバーライドするだけです。IsValid()
jQuery 検証で機能するクライアント側のルールを取得するには、拡張するカスタム検証属性のタイプ用のカスタム アダプターを作成する必要がありますSystem.Web.Mvc.DataAnnotationsModelValidator<YourCustomValidationAttribute>
。OnApplicationStart()
次に、このクラスを のメソッドに登録する必要がありますGlobal.asax
。
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(YourCustomValidationAttribute), typeof(YourCustomAdapter));
アダプターの例を次に示します。
public class FooAdapter : DataAnnotationsModelValidator<FooAttribute>
{
/// <summary>
/// This constructor is used by the MVC framework to retrieve the client validation rules for the attribute
/// type associated with this adapter.
/// </summary>
/// <param name="metadata">Information about the type being validated.</param>
/// <param name="context">The ControllerContext for the controller handling the request.</param>
/// <param name="attribute">The attribute associated with this adapter.</param>
public FooAdapter(ModelMetadata metadata, ControllerContext context, FooAttribute attribute)
: base(metadata, context, attribute)
{
_metadata = metadata;
}
/// <summary>
/// Overrides the definition in System.Web.Mvc.ModelValidator to provide the client validation rules specific
/// to this type.
/// </summary>
/// <returns>The set of rules that will be used for client side validation.</returns>
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
return new[] { new ModelClientValidationRequiredRule(
String.Format("The {0} field is invalid.", _metadata.DisplayName ?? _metadata.PropertyName)) };
}
/// <summary>
/// The metadata associated with the property tagged by the validation attribute.
/// </summary>
private ModelMetadata _metadata;
}
これは、サーバー側の検証http://msdn.microsoft.com/en-us/library/system.web.mvc.remoteattribute(v=vs.108).aspxを非同期的に呼び出したい場合にも役立ちます。