Un ExpressionBuilder di ASP.NET per recuperare le immagini all'interno del tema corrente

di Massimo Bonanni, in ASP.NET 2.0, Themes, UserScript,

Il problema che cerca di risolvere la classe che vi presento è quello di rendere possibile 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.

In parole povere:

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

dove Images/immagine.gif deve essere preso dalla cartella Images del tema corrente e non dalla cartella Images della root.

Per risolvere il problema ho realizzato un semplice Expression Builder, di seguito riportato:

<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

L'Expression Builder va configurato all'interno del web.config, in questo modo:

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

D'ora in poi sarà possibile scrivere nella pagine usando una sintassi come questa:

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

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi