Mic*_* B. 6 vb.net assemblies metadata helper asp.net-mvc-3
我创建了属性类来将元数据附加到属性,因此我可以显示表单输入字段的工具提示.
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
Run Code Online (Sandbox Code Playgroud)
我在扩展方法中使用此元数据:
<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
Run Code Online (Sandbox Code Playgroud)
所以我可以调用Html.HelpFor
我的任何模型的属性,如果它有适当的元数据,我会显示一个帮助图标,显示click(js)上的工具提示.
只要HelpAttribute
在与我用其装饰属性的类相同的程序集中定义,这一切都可以正常工作.今天我不得不转移HelpAttribute
到一个单独的dll(不同的命名空间),所以我这样做了,我引用了该项目,并期望它能够工作.我没有得到任何编译器错误,该应用程序工作正常,但它不显示帮助图标.我调试了代码,我看到构造函数HelpAttribute
被调用了具有正确文本的不同属性,但OnMetadataCreated
从未调用过.有谁知道为什么会这样,以及如何解决它?
Stu*_*rtQ 14
可能无法调用的另一个原因是,如果引用了错误的命名空间.所以
using System.Web.ModelBinding;
Run Code Online (Sandbox Code Playgroud)
将编译而不是被击中,但你应该使用
using System.Web.Mvc;
Run Code Online (Sandbox Code Playgroud)
我再次亲自回答我的问题。显然,在 SO 上发布内容可以帮助我在脑海中构建问题。当我转移HelpAttribute
到一个单独的类库时,我必须引用System.Web.Mvc
接口IMetadataAware
。我使用.NET 4.0
并自动引用了我前段时间为了测试目的安装的 MVC4。它没有给我带来任何错误,只是不起作用。当我改成System.web.Mvc
ver. 3.0一切都很顺利。
归档时间: |
|
查看次数: |
1381 次 |
最近记录: |