2011-08-05 36 views
2

我已經實現了擴展AssociatedMetaDataProvider的自定義元數據提供程序。該課程的最初目的是獲取一個屬性名稱並將其轉換爲Pascal封閉的單詞。驗證消息中的自定義元數據

我有一個新的要求,爲網站中所有必填字段的標籤添加可視指示符('*'字符)。我可以做這種變化,通過添加以下代碼到自定義元數據提供:

 PropertyInfo property = containerType.GetProperty(propertyName); 
     if (property.GetCustomAttributes(typeof(RequiredAttribute), true).Any()) 
      metadata.DisplayName = "* " + metadata.DisplayName; 

此代碼「作品」,因爲它增加了「*」字符的所有標籤。但是,它的副作用還是在所有驗證消息中添加了'*'字符(例如Html.ValidationMessageFor(x => x.FirstName)所使用的字符)。在這種情況下,我希望標籤爲'* First Name',並將錯誤消息是'需要名字'字段,而不是'*名字字段是必需的'

有沒有辦法提供添加'*'字符作爲標籤元數據的一部分而不影響在驗證消息中使用的屬性名稱?或者,在驗證消息正在構建時是否有辦法提供自定義元數據?

回答

1

花費更多的時間思考這個問題後,我設法拿出東西,似乎工作。我真的不喜歡的解決方案,但是:

 foreach (ValidationAttribute validationAttribute in attributes.Where(x => x is ValidationAttribute)) 
     { 
      if (String.IsNullOrEmpty(validationAttribute.ErrorMessage)) 
      { 
       validationAttribute.ErrorMessage = validationAttribute.FormatErrorMessage(formattedPropertyName); 
      } 
     } 

此代碼運行在同一時間在這個問題的代碼(如在自定義元數據提供的CreateMetadata方法的一部分)。它適用於我測試過的所有情況,但它並不真正爲驗證提供程序提供元數據,而是使用屬性名稱的Pascal封裝版本格式化錯誤字符串。這與大多數正常驗證消息的設置方式一致。它顯式設置驗證屬性上的錯誤消息的事實似乎不正確。

但是,我不知道這是作爲一個全球解決方案。此解決方案「有效」,但我希望有更好的解決方案。

+0

我仍然對這個答案有同樣的保留意見,就像我最初添加它時那樣。然而,我還沒有找到更好的解決方案,所以我將其標記爲接受的答案,除非/直到添加更好的解決方案。 – ajalexander

0

我現在在手機上,所以沒有反射器或IDE的好處,但是我認爲你可以在不改變驗證器的情況下做到這一點,因爲它們的行爲是使用錯誤消息的格式字符串,傳入與此處修改的顯示名稱相同的名稱。我可能錯了(雖然我喜歡你的方法)。

但是,通過編寫自定義編輯器模板,我已經完成了您所做的一切,這些模板也將html的控制權交給了Web開發人員。使用元數據方法,你不能給星號,比如它自己的類來着色。

使用模板更好,如果使用剃鬚刀,則可以使用佈局模板,以便所有字段類型都可以使用標準標籤/輸入方法。

如果需要使用當前模型,則使用Html.LabelFor,然後是可選模塊,這爲我提供了很大的靈活性,而且我更喜歡使用元數據解決方案,因爲它也不會干擾驗證消息。

就像我說的,在我最初的懷疑,雖然,我可能是錯的:)