18

私のアプリケーションでは、いくつかのモデルPasswordにプロパティが必要です (例: RegistrationandChangePasswordモデル)。プロパティには やのPasswordような属性がDataTypeありRequiredます。したがって、再利用性と一貫性を確保するために、次のものを作成しました。

interface IPasswordContainer{
    [Required(ErrorMessage = "Please specify your password")]
    [DataType(DataType.Password)]
    string Password { get; set; }
} 

class RegistrationModel : IPasswordContainer {
    public string Password { get; set; }
}

残念ながら、属性は機能しません。

次に、インターフェースをクラスに変更してみました:

public class PasswordContainer {
    [Required(ErrorMessage = "Please specify your password")]
    [DataType(DataType.Password)]
    public virtual string Password { get; set; }
}

public class RegistrationModel : PasswordContainer {
    public override string Password { get; set; }
}

今、それは働いています。なぜそうなのですか?

クラスから継承すると属性が機能するのに、インターフェイスから継承すると機能しないのはなぜですか?

4

1 に答える 1

27

インターフェイス プロパティの属性はクラスに継承されません。インターフェイスを抽象クラスにすることができます。

Microsoft からの回答が見つかりました:

製品チームは、次の 2 つの主な理由から、この機能を実装したくありません。

  • DataAnnotations.Validator との一貫性
  • ASP.Net MVC の検証動作との一貫性
  • トリッキーなシナリオ: クラスは、同じプロパティを持つ 2 つのインターフェイスを実装しますが、それらの属性は競合します。どの属性が優先されますか?
于 2012-08-24T09:27:14.253 に答える