データ注釈を使用したカスタム検証

asp.net-mvc data-annotations entity-framework

質問

入力されているデータを確認するためにデータ注釈を使用していますが、データを検証するためのよりカスタムな方法になると困ってしまいます。

データベースに対してクエリを実行して、存在するかどうかを確認し、「会社名が既に存在する」などの「カスタムdb-checkエラー」が表示された場合はユーザーに報告する必要があります。

そのようなことをデータ注釈と一緒に実装するにはどうすればよいですか。

私は3.5sp1に付属のlinqとエンティティフレームワークを使用してすべてのクエリを実行しています。

/ M

受け入れられた回答

データ注釈を拡張するカスタム属性

データストアに対するオブジェクトインスタンスの検証を行う独自の属性を記述する必要があります。

クラスがSystem.ComponentModel.DataAnnotations.ValidationAttributeクラスを継承していることを確認してください。

public class MustNotExist: ValidationAttribute
{
    ...
}

あぶない

オブジェクトがデータストア内で一意であることを検証する必要があるとき、私は同様の状況に出くわしました。しかし、この種の検証はエンティティクラス自体では不可能でした。なぜなら、それは作成中のエンティティに対してのみ機能するはずであり、すでにデータストアからエンティティを返したときには機能しないためです。

私の解決策は、別々のインターフェース、クラス、および属性を持つことでした。

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

エンティティパラメータを取得するコントローラアクションに属性を設定できました。次に、フィルタアクション属性はコントローラのアクションパラメータをチェックし(それらのタイプと値に簡単にアクセスできます)、正しいパラメータ(属性定義で指定されたタイプ)に対して外部バリデータを実行し、検証が失敗するとModelStateエラーを生成します。

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
    if (!this.ModelState.IsValid)
    {
        // act accordingly - probably return some error depending on model state errors
    }
    // register new user in data store
}

このようにして、私は実際にそれを必要としていたアクションに対してのみ外部検証を実行することができました、そしてこのテクニックはまた私のコントローラーアクションコードがきれいで短いままでいるのを助けました。私がしなければならなかったのは、モデル状態エラーがあるかどうかを確認することだけです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow