2011-02-03 25 views
4

私は次の操作を実行した場合:RangeAttributeに定数でない値を指定していますか?

`[Range(1910, DateTime.Now.Year)] 
public int Year { get; set; }` 

を私は次のエラーを取得する:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

任意のアイデアなぜですか?

答えて

6

を使用すると、現在の年間テストされていない

public class RangeYearToCurrent : RangeAttribute 
{ 
    public RangYearToCurrent(int from) 
     : base(typeof(int), from, DateTime.Today.Year) { } 
} 

を指定するRangeYearToCurrentのようなもの...ここ

+0

どのようにこのクラスを使用して範囲を指定しますか? –

+0

RangeYearToCurrent(1910) public int Year {get;セット; } –

+0

誰かが実用的なソリューションを投稿できますか? – Burjua

2

これは属性では実行できません。

属性は常に直接コンパイルされ、「実行可能コード」ではなくメタデータとして扱われます。そのため、属性のパラメータはコンパイル時に完全に知る必要があります。つまり、定数値です。

ランタイム式を必要とする値を使用しようとすると、属性で失敗します。これは、RangeAttributeだけでなく、すべての属性に当てはまります。あなたはこのためにカスタムを構築することができ

+0

これは 'user726939'の手法を使って達成できます。 –

4

は私のバージョンは前の回答に基づいて、です(ただし、両方の作業を属性クライアント/サーバー側):

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] 
public class RangeYearToCurrent : RangeAttribute,IClientValidatable { 
    public RangeYearToCurrent(int from) : base(from, DateTime.Today.Year) { } 

    #region IClientValidatable Members 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rules = new ModelClientValidationRangeRule(this.ErrorMessage, this.Minimum, this.Maximum); 
     yield return rules; 
    } 

    #endregion 
} 

使用Exemple:

[RangeYearToCurrent(1995, ErrorMessage = "Invalid Date")] 
public int? Year { get; set; } 
+0

これは正解です。 –

関連する問題