2011-10-18 10 views
2

私はASP.NET MVC3では、[RegularExpression]タグを動的にする方法はありますか?

[RegularExpression(...)] 
public string PenguinGenome 
{ 
    get;set; 
} 

public int PenguinSpecies 
{ 
    get; set; 
} 

のような私のviewmodelで何かを持っているがPenguinSpeciesに基づいて動的に作成する方法が...ありますか?

すなわち:

[RegularExpression(GetExpression(PenguinSpeciesId))] 
public string PenguinGenome 
{ 
    get;set; 
} 

public int PenguinSpeciesId 
{ 
    get; set; 
} 

public string GetExpression(int speciesId) 
{ 
    if (.....) 
     return "[some regex]"; 
} 

PenguinSpeciesIdは、コンテキスト内に存在しないので、これは動作しません。何が最善の回避策ですか?

+0

問題は、属性が特定のクラス/プロパティ/その他のメタデータの一部であるため、非静的な参照を含むことができないことです。したがって、インスタンス化するメソッドやプロパティを呼び出すことはできません。 – Buildstarted

答えて

1

This is an article(ASP.NET MVC2)ですが、プロセスはASP.NET MVC3とほぼ同じです。

基本的に、オブジェクトを見ることができる独自のカスタムバリデーターを作成し、検証する適切な方法を決定する必要があります。

0

正規表現バリデーターは実際にあなたが望むものではありません。別のモデルプロパティの値に基づいてPenguinGenomeを検証する必要があります。言い換えれば、ここではプロパティの検証は必要ありませんが、モデルの検証は必要ありません。

モデル認識の属性を使用することはできますが、依存関係を「隠す」(誰もモデルクラスを見ても誰にもわからない、PenguinGenomeの検証はPenguinSpeciesIdに依存します)ので個人的には思いません。むしろIValidatableObjectをここで使用したいと思います。

+0

正規表現タグを使用すると、正規表現検証が自動的に私のビューに置かれます。このソリューションは同じですか? – NibblyPig

+0

残念ながら、自動生成されたクライアント側の検証はあなたのシナリオでは機能しません。生成された正規表現は、PenguinSpeciesIdの変更によって変更する必要があります。カスタム検証ロジック(jqueryはあなたの友人)またはMVCでサポートされているリモート検証をeighterで使用する必要があります。 – rouen

関連する問題