4

EntityFramework T4 テンプレートによって自動的に生成されたこの POCO クラスがあるとします (手動で編集することはできません)。

public partial class Customer
{
    [Required]
    [StringLength(20, ErrorMessage = "Customer Number - Please enter no more than 20 characters.")]
    [DisplayName("Customer Number")]
    public virtual string CustomerNumber { get;set; }

    [Required]
    [StringLength(10, ErrorMessage = "ACNumber - Please enter no more than 10 characters.")]
    [DisplayName("ACNumber")]
    public virtual string ACNumber{ get;set; }
}

「ACNumber」は不適切な名前のデータベース フィールドであるため、自動生成機能は正しい表示名とエラー メッセージ (「Account Number」である必要があります) を生成できないことに注意してください。

したがって、このバディ クラスを手動で作成して、自動生成できなかったカスタム属性を追加します。

[MetadataType(typeof(CustomerAnnotations))]
public partial class Customer { }

public class CustomerAnnotations
{
    [NumberCode] // This line does not work
    public virtual string CustomerNumber { get;set; }

    [StringLength(10, ErrorMessage = "Account Number - Please enter no more than 10 characters.")]
    [DisplayName("Account Number")]
    public virtual string ACNumber { get;set; }
}

[NumberCode] は、数字とハイフンのみを許可する単純な正規表現ベースの属性です。

[AttributeUsage(AttributeTargets.Property)]
public class NumberCodeAttribute: RegularExpressionAttribute
{
    private const string REGX = @"^[0-9-]+$"; 
    public NumberCodeAttribute() : base(REGX) { }
}

現在、ページをロードすると、DisplayName 属性が正しく機能します。生成されたクラスではなく、バディ クラスの表示名が表示されます。

StringLength 属性が正しく機能しません。生成されたクラスからのエラー メッセージが表示されます (「Account Number」ではなく「ACNumber」)。

しかし、バディ クラスの [NumberCode] 属性は AccountNumber プロパティに適用されません。

foreach (ValidationAttribute attrib in prop.Attributes.OfType<ValidationAttribute>())
{
    // This collection correctly contains all the [Required], [StringLength] attributes
    // BUT does not contain the [NumberCode] attribute
    ApplyValidation(generator, attrib);
}

prop.Attributes.OfType<ValidationAttribute>()コレクションに [NumberCode] 属性が含まれていないのはなぜですか? NumberCode は、ValidationAttribute を継承する RegularExpressionAttribute を継承するため、存在するはずです。

[NumberCode] 属性を自動生成されたクラスに手動で移動すると、prop.Attributes.OfType<ValidationAttribute>()コレクションに含まれます。

だから私が理解していないのは、バディクラスの他の属性が機能しているときに、この特定の属性がバディクラスで機能しない理由です。そして、この属性が自動生成されたクラスでは機能するのに、バディでは機能しないのはなぜですか。何か案は?

また、StringLength が上書きされないのに、なぜ DisplayName がバディによって上書きされるのでしょうか?

4

2 に答える 2

1

VS2008とMVC2を使用してコードを再作成しましたが、問題なく動作しました。

于 2010-06-22T19:27:17.263 に答える
1

NumberCodeAttribute の AttributeUsage 属性で AllowMultiple=True が指定されていないことに気付きました。そのパラメーターのデフォルト (指定されていない場合) は false です。それを追加してみてください。表示されるはずです。

于 2010-06-29T16:36:19.997 に答える