我创建了属性类来将元数据附加到属性,因此我可以显示表单输入字段的工具提示。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