部分クラスでのプロパティの属性の設定
Entity Framework (EF)によって生成された従業員クラスがあります。
public partial class employee
{
private string name;
public string Name
{
get{return name;}
set{ name = value;}
}
}
ここで、EFによって生成されたものを拡張してコードを書き直す必要がないように、私が作成した別の従業員部分クラスのMVC3検証に使用するために必要な属性をnameプロパティに配置します。 EFによって生成されたモデルを更新するとします。
私が書いた部分クラスは、同じアセンブリと名前空間にあります。
public partial class employee
{
// What should I write here to add required attribute in the Name property?
}
実際にはバディクラスでのみ可能ですが、お勧めの方法ではありません。多くの場合、ビューごとに異なる検証が必要ですが、エンティティは検証属性の単一のセットしか保持できないため、カスタムビューモデルで検証を保持する必要があります。
バディクラスの例:
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(EmployeeMetadata))]
public partial class Employee
{
private class EmployeeMetadata
{
[Required]
public object Name; // Type doesn't matter, it is just a marker
}
}
私の知る限り、あなたはできません-それは実行可能ではありません。
MVC3に、別のプロパティにrelateする属性を他の場所(タイプなど)に追加する方法があるかどうかを確認する必要があります。
または、プロキシプロパティを追加することもできます。
[ValidationAttributesHere]
public string ValidatedName
{
get { return Name; }
set { Name = value; }
}
これを行う別の方法は次のとおりです。
private class EmployeeMetadata
{
//the type HAS to match what your have in your Employee class
[Required]
public string Name { get; set; }
}
public partial class Employee : EmployeeMetadata
{
}
少なくともこれはLinqtoSQLで機能しました。ただし、GetCustomAttributes
を介して属性にアクセスするのに問題がありました(System.Attribute.GetCustomAttributes
を使用しても役に立たなかったようです)。それにもかかわらず、MVCはそれらの属性を尊重しました。さらに、これはインターフェースからの継承では機能しません。インターフェイスからの属性の受け渡しは、MetadataType
クラス属性を使用した場合にのみ機能します( Ladislav Mrnkaによる回答 を参照)。