2010-04-12 43 views
3

我的任務是更改MVC2.0中DataAnnotation驗證屬性的ErrorMessage屬性。例如,我應該能夠傳遞一個ID而不是Model屬性的實際錯誤消息,並使用該ID從另一個服務(例如數據庫)檢索某些內容(錯誤消息),並在View中顯示該錯誤消息,而不是ID。爲了做到這一點,我需要設置DataAnnotation驗證屬性的ErrorMessage屬性。如何更改MVC2.0中DataAnnotation驗證的ErrorMessage屬性

[StringLength(2, ErrorMessage = "EmailContentID.")] 
    [DataType(DataType.EmailAddress)]   
    public string Email { get; set; } 

好像被剛剛重寫DataAnnotationsModelValidatorProvider的 保護覆蓋的IEnumerable GetValidators(ModelMetadata元,ControllerContext背景下,IEnumerable的屬性)

但是它似乎是夠複雜的一件容易的事。

a。 MVC DatannotationsModelValidator的ErrorMessage屬性是隻讀的。所以我不能在這裏設置任何東西 b。已經在MVC DatannotationsModelValidator中設置的System.ComponentModel.DataAnnotationErrorMessage屬性(get和set),所以我們不能再次設置。如果您嘗試設置您收到「屬性不能設置多次...」錯誤信息出現。

public class CustomDataAnnotationProvider : DataAnnotationsModelValidatorProvider 
{ 
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes) 
    { 
     IEnumerable<ModelValidator> validators = base.GetValidators(metadata, context, attributes); 

     foreach (ValidationAttribute validator in validators.OfType<ValidationAttribute>()) 
     { 
      messageId = validator.ErrorMessage; 
      validator.ErrorMessage = "Error string from DB And" + messageId ; 
     } 

     //...... 
    } 
} 

任何人都可以請幫助我嗎?

回答

2

以下是問題:您更改錯誤消息屬性的動機是什麼?

通過非常仔細的思考這一點,因爲您正在沿着一條路徑去模糊應用程序中實際發生的情況。當然數據庫informatino是有用的,但它不是驗證的一部分,也不應該。

當你朝這個方向前進時,你基本上說只有在有數據庫問題的情況下驗證纔是無效的。我看到兩個問題:

  1. 它打破了關注的分離。您正在報告模型中的持久性錯誤,而不是它發生的位置。
  2. 該解決方案不是單元可測試的,因爲您必須使用數據庫。

我不喜歡上述兩者之一。

你能解決這個問題嗎?可能的話,如果你將創建自己的自定義驗證屬性。我將不得不檢查並確保這是正確的。另一種選擇是瞄準定製驗證:

http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

這篇文章也可以幫助你在方向頭部,你的願望:

http://ryanrivest.com/blog/archive/2010/01/15/reusable-validation-error-message-resource-strings-for-dataannotations.aspx

你想解決這個問題?如果您試圖在應用程序中保持適當的關注點,那麼實際上並非如此。我不會警告我的驗證錯誤消息(這是無效的)與數據庫錯誤(我無效,但數據庫也爆炸了)。只是我的兩分錢。

0

有內置的方法可以通過資源獲取錯誤消息。在運行時不用數據庫查找來獲取資源,而是從數據庫生成資源並將其用於錯誤消息。

然後,您可以使用ErrorMessageResourceNameErrorMessageResourceType來允許DataAnnotation執行資源查找,而不是對特定字符串進行硬編碼。

public sealed class MyModel 
{ 
    [Required(
     ErrorMessageResourceName="MyDescriptionResource", 
     ErrorMessageResourceType=typeof(MyCustomResource))] 
    public string Description { get; set; } 
} 
0

你也可以看看msdn上的ValidationAttribute.FormatErrorMessage Method

此方法使用ErrorMessageString 屬性格式化錯誤消息 。此方法將觸發 錯誤的數據字段的名稱 附加到格式化的錯誤消息。 您可以通過創建覆蓋此方法的 派生類來自定義如何格式化錯誤 消息。

快速樣品(而不是意味着是一個明確的例子)

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, 
       Inherited = true)] 
public sealed class PostCodeValidationAttribute 
    : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     if(value == null) 
      return true; 

     string postCode = value as string; 
     if(string.IsNullOrEmpty(postCode)) 
      return true; 

     if (!PostCode.IsValidPostCode(postCode, this.PostCodeStyle)) 
      return false; 

     return true; 
    } 

    public PostCodeStyle PostCodeStyle { get; set; } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(
      "{0} is not a valid postcode for {1}", name, PostCodeStyle); 
    } 
} 

*我省略了PostCodeStyle枚舉還有PostCode類用於驗證郵政編碼。