Có bốn tùy chọn (ngoài "<%# %>
" dữ liệu kiểu, mà tôi không nhớ ommend):
- Đặt giá trị ở mã phía sau. Điều này làm tăng ViewState, và tất nhiên yêu cầu thay đổi mã cho mỗi trường hợp kiểm soát.
- Sử dụng ExpressionBuilder tùy chỉnh. Điều này không làm tăng ViewState, nhưng nó đòi hỏi phải thay đổi tất cả các đánh dấu của bạn.
- Sử dụng Bộ điều khiển để thay đổi hành vi của điều khiển ở mọi nơi trong ứng dụng của bạn; ví dụ, bằng cách sửa đổi thuộc tính ImageUrl trước khi điều khiển được hiển thị. Có thể được thực hiện mà không có tác động ViewState.
- Sử dụng lớp kế thừa từ lớp ImageButton, kết hợp với ánh xạ thẻ để sử dụng lớp đó thay vì bản gốc ở mọi nơi trong ứng dụng của bạn và loại bỏ nhu cầu thay đổi đánh dấu của bạn. Có thể được thực hiện mà không có tác động ViewState.
Tùy chọn tốt nhất tùy thuộc vào yêu cầu của ứng dụng, nhưng tôi thường thích bộ điều hợp nếu bạn muốn thực hiện thay đổi trên toàn trang web.
Dưới đây là một ví dụ, trong trường hợp nó giúp:
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);
}
}
}
Configure nó vào ứng dụng của bạn với các mục sau đây trong App_Browers/adapter.trình duyệt:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.ImageButton"
adapterType="Sample.ImageButtonControlAdapter" />
</controlAdapters>
</browser>
</browsers>
đánh dấu của bạn sẽ là:
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="iagree.png" />
mát, phải không ??
Tôi đã suy nghĩ về một cái gì đó để tránh CodeBehind – Himberjack
Mặc dù cách tiếp cận này sẽ làm việc, một nhược điểm là nó cũng làm tăng kích thước của ViewState (không thể vô hiệu hóa, vì bạn đang kiểm tra! IsPostBack). – RickNZ