質問

私が入力されていたデータを確認するためにデータ注釈を使用していますが、それは、データを検証するために複数のカスタム方法に来るとき、私はこだわってます。

私は、このような

「COMPANYNAMEがすでに存在している」として、「カスタムDB-チェックエラー」が表示された場合のものはありか存在するかどうかを確認するために、データベースに対してクエリを実行し、ユーザーに報告する必要があります

どのように私はdataannotationsと一緒にそのようなことを実現することができますか?

私は、すべてのクエリは、

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) ...
    ...
}

私は、エンティティのパラメータを取得し、コントローラのアクションに私の属性を配置することができました。フィルタのaction属性は、次いで、(それはそのタイプおよび値を容易にアクセスすることができる)コントローラのアクション・パラメータをチェックし、正しいパラメータ(属性定義に設けタイプ)に対して外部のバリデータを実行し、検証が失敗したときに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
}

私は実際にそれを必要とし、それらのアクションに外部検証を実行することができた。この方法で、この技術はまた、クリーンで短期滞在する私のコントローラのアクションコードを助けました。私がしなければならなかったすべては、どのモデル状態のエラーがあるかどうかを確認することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top