web-dev-qa-db-ja.com

部分クラスでのプロパティの属性の設定

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?
}
23
yrahman

実際にはバディクラスでのみ可能ですが、お勧めの方法ではありません。多くの場合、ビューごとに異なる検証が必要ですが、エンティティは検証属性の単一のセットしか保持できないため、カスタムビューモデルで検証を保持する必要があります。

バディクラスの例:

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
  }
}
27
Ladislav Mrnka

私の知る限り、あなたはできません-それは実行可能ではありません。

MVC3に、別のプロパティにrelateする属性を他の場所(タイプなど)に追加する方法があるかどうかを確認する必要があります。

または、プロキシプロパティを追加することもできます。

[ValidationAttributesHere]
public string ValidatedName
{
    get { return Name; }
    set { Name = value; }
}
9
Jon Skeet

これを行う別の方法は次のとおりです。

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による回答 を参照)。

0
jahu