Hay cuatro opciones (además del enlace de datos "<%# %>
", que no recomiendo recomendación):
- Establezca el valor en el código detrás. Esto infla ViewState y, por supuesto, requiere cambios de código para cada instancia del control.
- Utilice un ExpressionBuilder personalizado. Esto no infle ViewState, pero requiere cambiar todo su marcado.
- Use un Adaptador de control para cambiar el comportamiento del control en todas partes de su aplicación; por ejemplo, modificando la propiedad ImageUrl antes de que se represente el control. Se puede hacer sin impacto en ViewState.
- Utilice una clase heredada de la clase ImageButton, combinada con la asignación de etiquetas para usar esa clase en lugar del original en todas partes de la aplicación, y elimine la necesidad de realizar cambios en su marcado. Se puede hacer sin impacto en ViewState.
La mejor opción depende de los requisitos de su aplicación, pero generalmente prefiero un adaptador de control si desea realizar los cambios en todo el sitio.
He aquí un ejemplo, en el caso de que ayuda:
using System;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.Adapters;
namespace Sample
{
public class ImageButtonControlAdapter : WebControlAdapter
{
protected override void BeginRender(HtmlTextWriter writer)
{
ImageButton image = this.Control as ImageButton;
if ((image != null) && !String.IsNullOrEmpty(image.ImageUrl))
{
//
// Decide here which objects you want to change
//
if (!image.ImageUrl.StartsWith("http") &&
!image.ImageUrl.StartsWith("data:"))
{
image.ImageUrl = ResourceManager.GetImageCDN(image.ImageUrl);
}
}
base.BeginRender(writer);
}
}
}
Configurar en su aplicación con la siguiente entrada en App_Browers/adaptador.navegador:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.ImageButton"
adapterType="Sample.ImageButtonControlAdapter" />
</controlAdapters>
</browser>
</browsers>
su margen de beneficio sería:
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="iagree.png" />
frío, ¿no ??
Estaba pensando en algo para evitar el CodeBehind – Himberjack
Aunque este enfoque funcionará, un inconveniente es que también aumenta el tamaño de ViewState (que no se puede deshabilitar, ya que está buscando! IsPostBack). – RickNZ