2010-03-15 56 views
8

我在MVC2應用程序中使用dataannotations,並且在嘗試使用RESX文件資源獲取錯誤消息時有點沮喪。DataAnnotations和資源不能很好地播放

我已經嘗試了以下但不斷收到異常「的屬性參數必須是一個常量表達式,屬性參數類型的typeof運算表達式或數組創建表達式」

[Required(ErrorMessage = Resources.ErrorMessages.Required)] 
[Required(ErrorMessageResourceName = Resources.ErrorMessages.Required, 
      ErrorMessageResourceType = typeof(Resources.ErrorMessages)] 

我不斷收到該錯誤信息除非我將ErrorMessageResourceName替換爲「必需」而不是Resources.ErrorMessages.Required

任何人都可以告訴我,如果我做對了嗎?

回答

12

是的,你最後做的事情基本上是正確的。 ErrorMessageResourceName採用名稱所暗示的名稱,名稱的資源,而不是資源本身。

Resources.ErrorMessages.Required指向實際(本地化)錯誤消息(資源)。資源的名稱只是「必需的」,而資源管理器的類型(用於ErrorMessageResourceType)是包含該資源的類,在此例中爲Resources.ErrorMessages類。

所以你的聲明應該是這樣的:

[Required(ErrorMessageResourceType = typeof(Resources.ErrorMessages), 
    ErrorMessageResourceName = "Required")] 
public string Something { get; set; } 
+1

我可以只使用ErrorMessage屬性呢?我更喜歡強類型。 – devlife 2010-03-15 23:37:48

+4

@devlife:不。如果您想要本地化,請不要。這正是資源屬性的用途。事實上,這就是* any *本地化的方式,在鏈中的某一點,您將不得不根據名稱查找資源字符串,這就是外部化資源的工作原理。而且這仍然是基於資源類的「強類型」,您只是對資源名稱本身沒有編譯時安全性。如果你想這樣做,只需像'public const string Required =「Required」那樣創建一個像'ResourceNames'這樣的類,那麼你可以指定這些類作爲資源名稱。 – Aaronaught 2010-03-15 23:58:16

相關問題