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...