有四個選項(除了「<%# %>
」風格的數據綁定,我不記得ommend):
- 在後面的代碼中設置值。這會膨脹ViewState,並且當然需要對控件的每個實例進行代碼更改。
- 使用自定義ExpressionBuilder。這不會誇大ViewState,但它確實需要更改所有標記。
- 使用控制適配器可以更改應用程序中任何位置的控件行爲;例如,通過在呈現控件之前修改ImageUrl屬性。可以在沒有ViewState影響的情況下完成。
- 使用從ImageButton類繼承的類,並結合使用標記映射來在應用程序中使用該類而不是原始位置,並且無需更改標記。可以在沒有ViewState影響的情況下完成。
最好的選擇取決於您的應用程序的要求,但是如果您想在整個站點進行更改,我通常更喜歡使用控制適配器。
下面是一個例子,在情況下,它可以幫助:
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);
}
}
}
配置成與App_Browers /適配器以下條目您的應用程序。瀏覽器:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.ImageButton"
adapterType="Sample.ImageButtonControlAdapter" />
</controlAdapters>
</browser>
</browsers>
你的標記是:
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="iagree.png" />
酷吧?
我在想什麼,以避免CodeBehind – Himberjack 2012-01-05 05:57:21
雖然這種方法將工作,但一個缺點是,它也增加了ViewState(無法禁用,因爲您檢查!IsPostBack)的大小。 – RickNZ 2012-01-05 07:08:10