Creé una clase de atributo para adjuntar metadatos a las propiedades, por lo que puedo mostrar información sobre herramientas para los campos de entrada del formulario.IMetadataAware.OnMetadataCreated nunca se llama
HelpAttribute
implementa 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
que utilizan estos metadatos en mi método de extensión:
<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
por lo que puedo llamar Html.HelpFor
para cualquiera de las propiedades de mi modelo y si tiene metadatos apropiados que mostrar un icono de ayuda que muestra la información sobre herramientas al hacer clic (js).
Todo funciona bien siempre que HelpAttribute
se defina en el mismo ensamblaje que las clases con las que decorar sus propiedades. Hoy tuve que mover HelpAttribute
a una dll separada (también diferente espacio de nombres), así que lo hice, hice referencia al proyecto y esperé que funcionara. No recibo ningún error de compilación, la aplicación funciona bien, pero no muestra los íconos de ayuda. Depuré el código y veo que el constructor de HelpAttribute
se llama para diferentes propiedades con un texto adecuado, pero OnMetadataCreated
nunca se llama. ¿Alguien tiene una idea de por qué es eso y cómo solucionarlo?
El código publicado aquí no se refiere a la cuestión planteada, es sólo un atributo repetitivo sin considerar el contexto del problema de OP Incluso si el código fuera de alguna utilidad, no debería ser arrojado sin ceremonias sin alguna explicación de lo que hace y cómo responde la pregunta original. – RobD