28 maggio 2007

VB.NET : ExpressionBuilder per recuperare le immagini all'interno del tema corrente.

Il problema che cerca di risolvere la classe che vi presento è il seguente: supponiamo di volere che una proprietà di un controllo che prevede l'url di una immagine, sia valorizzata con l'url di una immagine contenuta nel tema corrente della pagina aspx.
In parole povere:

<img src="Images/immagine.gif" />

dove Images/immagine.gif deve essere presa dalla cartella Images del tema corrente e non dalla cartella Images della root.
Per risolvere il problema ho realizzato un semplice Expression Builder:

<ExpressionPrefix("ThemeImage")> _
Public Class ThemeImageExpressionBuilder
  Inherits System.Web.Compilation.ExpressionBuilder

  Public Overrides Function GetCodeExpression(ByVal entry As System.Web.UI.BoundPropertyEntry, _
      ByVal parsedData As Object, _
      ByVal context As System.Web.Compilation.ExpressionBuilderContext) As System.CodeDom.CodeExpression
    Dim metodo As CodeMethodInvokeExpression = New CodeMethodInvokeExpression()
    metodo.Method.TargetObject = New CodeTypeReferenceExpression("ThemeImageExpressionBuilder")
    metodo.Method.MethodName = "GetAbsoluteImageURL"
    metodo.Parameters.Add(New CodePrimitiveExpression(entry.Expression))
    Return metodo
  End Function

  ''' Restituisce il path dell'immagine comprensivo di tema
  Public Shared Function GetAbsoluteImageURL(ByVal relativeImageURL As String) As String
    Dim retURL As String = String.Empty
    If TypeOf HttpContext.Current.Handler Is UI.Page Then
      Dim page As UI.Page = CType(HttpContext.Current.Handler, UI.Page)
      Dim themeName As String = page.Theme
      If themeName <> "" Then
        retURL = System.IO.Path.Combine("~/App_Themes/" + themeName, relativeImageURL)
      Else
        retURL = relativeImageURL
      End If
    End If
    Return retURL
  End Function

  Public Overrides ReadOnly Property SupportsEvaluate() As Boolean
    Get
      Return True
    End Get
  End Property
End Class

Configurando l'utilizzo di questo ExpressionBuilder all'interno del web.config:

<compilation debug="true">
  <expressionBuilders>
    <add expressionPrefix="ThemeImage" type="ThemeImageExpressionBuilder"/>
  </expressionBuilders>

Possiamo scrivere, all'interno delle nostre pagine aspx:

<img src="<%& ThemeImage: Images/immagine.gif %>" />

Nessun commento: