我創建了屬性類來將元數據附加到屬性,因此我可以顯示錶單輸入字段的工具提示。IMetadataAware.OnMetadataCreated永遠不會調用
HelpAttribute
實現IMetadataAware
:
Public Class HelpAttribute
Inherits Attribute
Implements System.Web.Mvc.IMetadataAware
Public Sub New(text As String)
_text = text
End Sub
Private _text As String
Public ReadOnly Property Text As String
Get
Return _text
End Get
End Property
Public Sub OnMetadataCreated(metadata As System.Web.Mvc.ModelMetadata) Implements System.Web.Mvc.IMetadataAware.OnMetadataCreated
metadata.AdditionalValues.Add("HelpText", _text)
End Sub
End Class
我利用這個元數據在我的擴展方法:
<Extension()>
Public Function HelpFor(Of TModel, TProperty)(ByVal htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty))) As MvcHtmlString
Dim metaData = ModelMetadata.FromLambdaExpression(Of TModel, TProperty)(expression, htmlHelper.ViewData)
If metaData.AdditionalValues.ContainsKey("HelpText") Then
Dim helpText = metaData.AdditionalValues("HelpText")
Return MvcHtmlString.Create(String.Format("<span class=""help""></span><div class=""tooltip"" style=""display: none""><div class=""border-top""></div><div class=""close""><a href=""#"">close</a></div><br class=""clear""><div class=""content"">{1}</div></div>", htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(metaData.PropertyName), helpText, metaData.DisplayName))
End If
Return MvcHtmlString.Create(String.Format("<span class=""no_help""></span>", htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(metaData.PropertyName), metaData.DisplayName))
End Function
所以我可以打電話Html.HelpFor
任何我的模型的屬性,如果有合適的元數據我展示點擊(js)顯示工具提示的幫助圖標。
只要HelpAttribute
在與我裝飾其屬性的類相同的程序集中定義,這一切都可以正常工作。今天我必須將HelpAttribute
移動到一個單獨的dll(不同的命名空間),所以我這樣做了,我引用了該項目,並期望它可以工作。我沒有收到任何編譯器錯誤,該應用程序工作正常,但它不顯示幫助圖標。我調試了代碼,發現HelpAttribute
的構造函數被調用了不同的屬性和正確的文本,但OnMetadataCreated
永遠不會被調用。有沒有人有一個想法,爲什麼這是如何解決它?
這裏發佈的代碼不屬於提出的問題,它只是沒有考慮上下文中的樣板屬性OP的問題。即使代碼是有用的 - 它不應該被毫不客氣地拋棄,沒有解釋它的作用以及它如何回答原始問題。 – RobD 2014-03-28 17:50:46