カスタム検証コード (組み込みのものから達成する方法がわからない)ValidationResult
から、ベースから継承してカスタム検証属性から返すことでカスタム クラスを作成することでそれを行うことができます。
public class CustomValidationResult: ValidationResult
{
// additional properties
}
次に、コントローラーからキャストして、検証結果がカスタムタイプであるかどうかを確認し、それに応じて動作させることができます。
アップデート:
ValidationResult
クラスが DataAnnotations アセンブリにあり、それらが変換されModelValidationResult
、MVC でアクセスできるのはそれだけであるため、上記のアイデアは機能しません。
データ注釈の検証から MVC に追加情報を渡すのは簡単ではないようです。
ソースコードを調べていたところ、ValidatableObjectAdapter
を に変換するのは であることがわかりIEnumerable<ValidationResult>
ましたIEnumerable<ModelValidationResult>
。このクラスを拡張するメリットはあまりないと思いますが、 をValidatableObjectAdapter
実装してコードModelValidator
を複製することでカスタムを簡単に作成できます。Validate
ModelValidationResult
カスタムとカスタムを作成する必要があり (検証から返されるのValidationResult
はこのカスタムです) 、追加情報を処理する変換コードをメソッドに入れることができます。ValidationResult
ConvertResults
public class CustomValidatableObjectAdapter : ModelValidator
{
public CustomValidatableObjectAdapter(ModelMetadata metadata, ControllerContext context)
: base(metadata, context)
{
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
object model = Metadata.Model;
if (model == null)
{
return Enumerable.Empty<ModelValidationResult>();
}
IValidatableObject validatable = model as IValidatableObject;
if (validatable == null)
{
throw new Exception("model is of not type validatable");
}
ValidationContext validationContext = new ValidationContext(validatable, null, null);
return ConvertResults(validatable.Validate(validationContext));
}
private IEnumerable<ModelValidationResult> ConvertResults(IEnumerable<ValidationResult> results)
{
foreach (ValidationResult result in results)
{
// iterate the ValidationResult enumeration and cast each into CustomValidationResult
// and conver them into enumeration of CustomModelValidationResult.
}
}
}
最後に、Global.asax.csの場合にDataAnnotationsModelValidatorProvider
これを使用するように指示する必要があります。CustomValidatableObjectAdapter
Application_Start
DataAnnotationsModelValidatorProvider.RegisterDefaultValidatableObjectAdapterFactory((metadata, context) => new CustomValidatableObjectAdapter(metadata, context));
したがって、 custom ValidationResult
、 custom ModelValidationResult
、およびcustom を作成する必要がありますValidatableObjectAdapter
。
私はこれをテストしていませんが、うまくいくことを願っています。これよりも優れた簡単な解決策を提案するかもしれません。