2012-10-17 21 views
4

我創建了以下自定義ValidationAttribute:如何檢索自定義C#資源類常量的字符串值?

public class DateRangeAttribute : ValidationAttribute, IClientValidatable { 
    public DateTime MinimumDate = new DateTime(1901, 1, 1); 
    public DateTime MaximumDate = new DateTime(2099, 12, 31); 

    public DateRangeAttribute(string minDate, string maxDate, string errorMessage) { 
    MinimumDate = DateTime.Parse(minDate); 
    MaximumDate = DateTime.Parse(maxDate); 
    ErrorMessage = string.Format(errorMessage, MinimumDate.ToString("MM/dd/yyyy"), MaximumDate.ToString("MM/dd/yyyy")); 
    } 
} 

,我想在我的MVC4視圖模型使用如下:

[DateRange(Resources.MinimumDate, Resources.MaximumDate, "Please enter a date between {0} and {1}")] 

資源是基於一組生成的資源類的存儲在SQL數據庫中的選項。生成的代碼,爲上述兩個資源屬性的簡化版本如下:

public class Resources { 
    public const string MinimumDate = "PropMinimumDate"; 
    public static string PropMinimumDate 
    { 
    get { return "12/15/2010" } 
    } 
    public const string MaximumDate = "PropMaximumDate"; 
    public static string PropMaximumDate 
    { 
    get { return "12/15/2012" } 
    } 
} 

雖然我不明白它是如何工作的,我不明白,在ValidationAttributes資源的典型用法將Resources.MinimumDate自動映射到PropMinimumDate並返回值「12/15/2010」。

我無法弄清楚如何自己手動進行編程跳躍,因此我可以將兩個日期值傳遞到我的自定義ValidatorAttribute中。如目前所編碼的,「PropMinimumDate」「PropMaximumDate」的minDate的maxDate參數(分別)的值傳遞到DateRangeAttribute的構造函數。

如果我嘗試

[DateRange(Resources.PropMinimumDate, Resources.PropMaximumDate, "Please enter a date between {0} and {1}")] 

我收到編譯錯誤:

的屬性參數必須是常量表達式的typeof屬性參數類型的表達或數組創建表達式

有沒有辦法完成這個任務,或者我試圖做不成?

回答

1

您需要將資源類的Type作爲參數,然後使用反射來獲取屬性值。

public class DateRangeAttribute : ValidationAttribute, IClientValidatable { 
    public DateTime MinimumDate = new DateTime(1901, 1, 1); 
    public DateTime MaximumDate = new DateTime(2099, 12, 31); 
    private Type _resourceType; 

    public DateRangeAttribute(string minDate, string maxDate, string errorMessage, Type resourceType) { 
    _resourceType = resourceType; 
    var minDateProp = _resourceType.GetProperty(minDate, 
          BindingFlags.Static | BindingFlags.Public); 
    var minDateValue = (string) minDateProp.GetValue((object) null, (object[]) null)); 
    MinimumDate = DateTime.Parse(minDateValue); 

    // similarly get the value for MaxDate 

    ErrorMessage = string.Format(errorMessage, 
      MinimumDate.ToString("MM/dd/yyyy"), MaximumDate.ToString("MM/dd/yyyy"));   
    } 
} 

[DateRange(Resources.MinimumDate, Resources.MaximumDate, "Please enter a date between {0} and {1}", typeof(Resources))] 
+0

真棒!這有助於解釋標準驗證屬性如何工作!非常感謝!! – CrazyWebDeveloper

0

你不是在嘗試不可能的事情,但你將不得不解決這個限制。因此,爲了符合編譯器我們有兩個選項,第一個是最理想的,請更改生成的類Resources

public class Resources { 
    public const string PropMinimumDate = "12/15/2010"; 
    public const string PropMaximumDate = "12/15/2012"; 
} 

現在,如果我們不能這樣做,那麼我們會去不同的路線,讓我們修改該裝飾財產存在的類並添加一對夫婦const領域它像這樣。

public class EntityClass 
{ 
    private const string MinimumDate = "12/15/2010"; 
    private const string MaximumDate = "12/15/2012"; 

    [DateRange(MinimumDate, MaximumDate, "Please enter a date between {0} and {1}")] 
} 

但是,除非你可以編碼生成實體類的最後選擇那種侵犯了您需要從數據庫中提取的值。所以,希望你可以改變Resources班。

相關問題