Ci sono quattro opzioni (oltre al databinding di stile "<%# %>
", che non rec ommend):
- Impostare il valore nel codice dietro. Questo gonfia ViewState e, naturalmente, richiede modifiche al codice per ogni istanza del controllo.
- Utilizzare un ExpressionBuilder personalizzato. Questo non gonfia ViewState, ma richiede la modifica di tutto il tuo markup.
- Utilizzare un adattatore di controllo per modificare il comportamento del controllo in qualsiasi punto della propria app; ad esempio, modificando la proprietà ImageUrl prima del rendering del controllo. Può essere fatto senza impatto di ViewState.
- Utilizzare una classe che eredita dalla classe ImageButton, combinata con la mappatura dei tag per utilizzare quella classe invece dell'originale in qualsiasi punto dell'app, ed eliminare la necessità di modifiche al markup. Può essere fatto senza impatto di ViewState.
L'opzione migliore dipende dai requisiti del vostro app, ma io di solito preferiscono un adattatore di controllo se si desidera apportare le modifiche a livello di sito.
Ecco un esempio, nel caso in cui aiuta:
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);
}
}
}
Configura nella tua app con la seguente voce nel App_Browers/adattatore.Browser:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.ImageButton"
adapterType="Sample.ImageButtonControlAdapter" />
</controlAdapters>
</browser>
</browsers>
vostro codice sarebbe:
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="iagree.png" />
fresco, giusto ??
Stavo pensando a qualcosa per evitare il CodeBehind – Himberjack
Anche se questo approccio funzionerà, uno svantaggio è che aumenta anche la dimensione di ViewState (che non può essere disabilitato, dal momento che stai controllando! IsPostBack). – RickNZ