Я создал класс атрибута для присоединения метаданных к свойствам, чтобы я мог отображать всплывающие подсказки для полей ввода формы.
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
никогда не вызывается.У кого-нибудь есть идея, почему это так и как это исправить?