2012-01-05 30 views
22

Tôi đang cố gắng sử dụng CDN cho hình ảnh của mình trên trang web. Vấn đề là, đôi khi tôi có các điều khiển máy chủ như ImageButton và tôi muốn sử dụng một lớp để trích xuất đầy đủ đường dẫn của CDN. vì mục đích đó tôi đã thử làm:Thẻ máy chủ không được chứa <% ... %> cấu trúc

<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="<%=ResourceManager.GetImageCDN("iagree.png")%>" /> 

và tôi nhận tiêu đề là lỗi.

Chỉ khi tôi đang sử dụng <% # nó sẽ hoạt động (và chỉ khi tôi kết nối dữ liệu). Tôi có thể làm điều này dễ dàng như thế nào? làm thế nào tôi có thể đặt mã CDN trên mã đánh dấu của tôi?

Cảm ơn!

Trả lời

23

Có bốn tùy chọn (ngoài "<%# %>" dữ liệu kiểu, mà tôi không nhớ ommend):

  1. Đặ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.
  2. 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.
  3. 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.
  4. 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 ??

1

Dĩ nhiên, đặt cược tốt nhất của bạn là để cung cấp cho các ImageButton một id, ví dụ:

<asp:ImageButton id="IAgreeImageButton" runat="server" Onclick="Agree" /> 

Và sau đó trong tải trang của bạn gán các imageurl:

void Page_Load(...) 
{ 
    if (!Page.IsPostback) 
    { 
      IAgreeImageButton.ImageUrl = ResourceManager.GetImageCDN("iagree.png"); 
    } 
} 
+1

Tôi đã suy nghĩ về một cái gì đó để tránh CodeBehind – Himberjack

+2

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

10

Bạn có thể đánh giá mã trong một thẻ máy chủ bằng cách tạo Trình tạo mã biểu thức của riêng bạn. Nó khá đơn giản.

[ExpressionPrefix("Code")] 
public class CodeExpressionBuilder : ExpressionBuilder 
{ 
    public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) 
    { 
     return new CodeSnippetExpression(entry.Expression); 
    } 
} 

Và một mục trong web.config của bạn:

<compilation debug="true" targetFramework="4.0"> 
    <expressionBuilders> 
     <add expressionPrefix="Code" type="[YourNamespace].CodeExpressionBuilder"/> 
    </expressionBuilders> 
</compilation> 

này cho phép bạn sử dụng cú pháp như:

<asp:ImageButton runat="server" ImageUrl='<%$ Code:ResourceManager.GetImageCDN("iagree.png") %>'> 

Dưới đây là một lời giải thích đầy đủ: http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx

+1

Cảm ơn bạn đã nhập mã. Đó chính xác là tôi đang tìm kiếm. – Misha

19

Trong trường hợp người khác gặp phải chuỗi này trong tương lai, bạn có thể nhận được kết quả cần thiết bằng cách bao quanh thẻ máy chủ với dấu nháy đơn, chứ không phải dấu ngoặc kép.

Bản gốc:

<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="<%=ResourceManager.GetImageCDN("iagree.png")%>" /> 

Phiên bản mới:

<asp:ImageButton runat="server" OnClick="Agree" ImageUrl='<%=ResourceManager.GetImageCDN("iagree.png")%>' /> 

này hoạt động trong Net 4.0, nhưng tôi sẽ đoán rằng nó sẽ làm việc trong các phiên bản khác nữa.

+1

Tôi đã có thể thích upvote nhiều lần! –

+19

điều này chỉ xuất ra thẻ thực tế bao gồm <% = thành phần tử cho tôi –

Các vấn đề liên quan