ASP.NET

'&' in ImageUrl richtig darstellen

Kodierung einer URL im Image-Control verhindern

Das Image-Control aus System.Web.UI.WebControls kann hat, wie ich finde, einen kleinen Schönheitsfehler: es setzt beim Rendern der angegebenen ImageUrl das src-Attribut nicht so, wie man die URL angegeben hat. Aus

http://www.meinedomain.de/getimage.axd?parameter1=xyz&¶meter2=123

wird

http://www.meinedomain.de/getimage.axd?parameter1=xyz&parameter2=123

Ein kleiner, aber feiner Unterschied. Grund für diese Auflösung des Ampersand, scheint der Aufruf der Funktion ResolveClientUrl in der Image-Control-Methode AddAttributesToRender zu sein.

Nun rendern die gängigen Browser das Bild zwar richtig und ansonsten kann man dem mit einer URLEncode-Methode begegnen, aber wer es korrekt haben mag, dem bleibt nichts anderes übrig, als ein eigenes Server-Control von Image abzuleiten und darin diese Methode zu überschreiben.

Das Ganze ist eigentlich recht einfach, wenn man sich mal über den Reflector von Lutz Roeder angesehen hat, wie die Methode im Original aufgebaut ist. In einem neuen Projekt vom Type Klassenbibliothek legt man schlicht folgende neue Klasse an und erstellt daraus eine DLL, die man in das eigentliche Web-Projekt einbindet.

Imports System
Imports System.Web.UI

Public Class ImageParamSave
    Inherits System.Web.UI.WebControls.Image

    Private _doresolveClientUrl As Boolean = False

    ''' <summary>
    ''' Soll die angegebene URL über ResolveClientUrl aufgelöst werden,
    ''' wie im Standard-Image?
    ''' </summary>
    Public Property DoResolveClientUrl() As Boolean
        Get
            Return _doresolveClientUrl
        End Get
        Set(ByVal value As Boolean)
            _doresolveClientUrl = value
        End Set
    End Property

    Protected Overrides Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)

        'NavigateUrl ohne Auflösung schreiben
        If DoResolveClientUrl = False Then

            'Src...
            If (Me.ImageUrl.Length > 0) Then
                writer.AddAttribute(HtmlTextWriterAttribute.Src, Me.ImageUrl)
            End If

            'Longdesc...
            If (Me.DescriptionUrl.Length > 0) Then
                writer.AddAttribute(HtmlTextWriterAttribute.Longdesc, _
                	Me.DescriptionUrl)
            End If

            'Verhindern, dass Src und Longdesc in der Basisklasse nochmal
            'geschrieben werden
            Me.ImageUrl = ""

        End If

        MyBase.AddAttributesToRender(writer)

    End Sub

End Class

Der vermeintliche Trick ist, dass man dem neuen Image-Control eine neue Eigenschaft verpasst, mit der man steuern kann, ober die URL aufgelöst werden soll, oder nicht. Da in jedem Fall auch die Basisklassenmethode aufgerufen werden muss, um die restlichen Attribute rendern zu lassen, muss man die Eigenschaft ImageUrl leeren, da diese dort abgefragt wird. Andernfalls würden zwei src-Attribute in den Ausgabe-Stream geschrieben.

Zu guter Letzt ist es nur noch nötig das neue Control am besten über die web.config bekanntzumachen:

<add tagPrefix="sct" namespace="zerbit.WebControls" assembly="ImageParamSave"/>

zum Download...
kick it on dotnet-kicks.de AddThis 0 wikio-Stimme(n) Trackback-Url...

Keine Kommentare bislang...

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

Artikel 251

  • Datum: 30.01.2008
    Kategorie: ASP.NET
    Zugriffe: 2.122
    Kommentare: 0
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei