我创建了属性类来将元数据附加到属性,因此我可以显示表单输入字段的工具提示.
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>",MetaData.DisplayName))
- End Function
所以我可以为我的任何模型属性调用Html.HelpFor,如果它有适当的元数据,我会显示一个帮助图标,显示click(js)上的工具提示.
只要HelpAttribute在与我用其装饰属性的类相同的程序集中定义,这一切都可以正常工作.今天我不得不将HelpAttribute移动到一个单独的dll(不同的命名空间),所以我这样做了,我引用了该项目并期望它能够工作.我没有得到任何编译器错误,该应用程序工作正常,但它不显示帮助图标.我调试了代码,我看到HelpAttribute的构造函数被调用了具有正确文本的不同属性,但是从不调用OnMetadataCreated.有谁知道为什么会这样,以及如何解决它?