生成されたクラスをモデルとして使用しており、そのプロパティの一部に DataAnnotation 属性を追加したいと考えています。生成されたコードなので、注釈を直接追加したくありません。それらをプロパティにアタッチする別の方法はありますか?
モデルをインターフェースにして、部分クラスを使用して、生成されたクラスをサブスクライブすることを検討しました。それがうまくいくと仮定して、それほど精巧でない解決策はありますか?
生成されたクラスをモデルとして使用しており、そのプロパティの一部に DataAnnotation 属性を追加したいと考えています。生成されたコードなので、注釈を直接追加したくありません。それらをプロパティにアタッチする別の方法はありますか?
モデルをインターフェースにして、部分クラスを使用して、生成されたクラスをサブスクライブすることを検討しました。それがうまくいくと仮定して、それほど精巧でない解決策はありますか?
はいあります。元のモデルと同じプロパティを持つメタデータ クラスを作成し、それを MetadataType 属性でモデルに接続する必要があります。
[MetadataType(typeof(MyModelMetadata))]
public partial class OriginalMyModel
{
}
public class MyModelMetadata
{
[Required]
public string MyProperty;
// ...
}
上記の例では、OriginalModel は適切なモデル クラスであり、MyModelMetadata はプロパティに注釈を付けるためだけに使用されるクラスです。MyModelMetadata には、モデルと同じプロパティが必要です。
クラスで MetadataType 属性を使用できます。
実際には、メタデータが生成されたモデルとかなり頻繁に同期しなくなるのを見てきましたが、これは頭痛の種になる可能性があります。データ注釈の代わりに、別の検証メカニズムを検討することをお勧めします。
私はFluent Validationを使用してきました。これは、非常に簡単に手に取って使い始めることができます。Fluent Validation 2.0 (まだベータ版) には、Fluent Validation からxValへの統合部分もあり、クライアント側の検証のためにプロジェクトに取り込むことができます。
Fluent Validation を使用すると、別のクラスで検証を定義できます。必要なのは、生成されたクラスに属性を追加して、使用するバリデーターを指定することだけです。これは、部分クラスによって実現できます。
または、データ注釈を含むドメイン モデルからマップされるビュー固有のモデルを作成することもできます。その場合、 AutoMapperなどを使用して前後のマッピングを簡素化します。次に、ドメイン モデルが変更された場合、メタデータ アプローチに対してコンパイル時エラーが発生します。