AdRotator控件全面探析

 AdRotator控件全面探析
一、 AdRotator控件的三種數據源模式
AdRotator以三種不同的模式填充它的圖像和導航屬性,我把它們分別稱爲“數據庫模式”,“XML模式”和“編程模式”。
(一) 數據庫模式
在數據庫模式下,一個AdRotator鏈接到一個數據源。該數據源表格至少需要三個數據列:一個相應於圖像的URL,一個相應於該圖像被點擊時要導航到的URL,一個相應於要在該圖像的ALT標籤中被顯示的字符串。下列是數據源表格中的可用字段,其中後面幾個是可選的:
列名稱 數據類型 說明
ID  int  這是主鍵。此列可給定任何名稱。
ImageUrl  nvarchar(length)  要作爲廣告顯示的圖像的相對或絕對URL。
NavigateUrl  nvarchar(length)  廣告的目標URL。如果沒有提供值,則廣告不是一個超鏈接。
AlternateText  nvarchar(length)  找不到圖像時顯示的文本。有些瀏覽器中,該文本還會作爲工具提示顯示出來。替換文字也用於輔助功能,以便無法看到圖形的用戶可以聽到大聲讀出的說明。
 Keyword  nvarchar(length)  可作爲頁篩選依據的廣告類別,可選。
 Impressions  int(4)  一個指示廣告的可能顯示頻率的數字。數字越大,顯示該廣告的頻率越高。在XML文件中,所有Impressions值的總和不能超過2,048,000,000-1。可選。
 Width  int(4)  圖像的寬度(以像素爲單位),可選。
 Height  int(4) 圖像的寬度(以像素爲單位),可選。
     

【注意】上表中提供的數據類型是SQL Server類型。如果使用的是不同的數據庫,請替換相應的合適類型。
當然,藉助於ASP.NET 2.0強大的數據源數據處理功能,你並不需要一個類似這樣的數據表格,你只要在DataSource本身使用一個SQL語句把該數據“拖入”到適當的結構中。比如說,如果你是動態地顯示SQL Server 2005 AdventureWorks示例數據庫ProductPhoto表格中圖像的縮略圖,並且允許在點擊一下這個縮略圖後能夠重定向到在同一個表格中的LargePhoto圖像(也是動態生成的)並且使用該產品表格中的一個描述來表示相應的可選文本,那麼你可以象下列這樣來使用:


<asp:SqlDataSource ID="ProductPhotos"
  runat="server"
  ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>"
  SelectCommand="SELECT Production.ProductPhoto.ProductPhotoID AS ID,
    './ProductThumbNail.ashx?ID=' + LTRIM(STR(Production.ProductPhoto.ProductPhotoID)) AS ImageUrl,
    './ProductPhoto.ashx?ID=' + LTRIM(STR(Production.ProductPhoto.ProductPhotoID)) AS NavigateUrl,
    Production.Product.Name AS AlternateText
    FROM Production.ProductPhoto
    INNER JOIN Production.ProductProductPhoto
      ON Production.ProductPhoto.ProductPhotoID = Production.ProductProductPhoto.ProductPhotoID
    INNER JOIN Production.Product
      ON Production.ProductProductPhoto.ProductID = Production.Product.ProductID">
</asp:SqlDataSource>

 

上面的代碼將產生一個具有四欄的結果集。之後,AdRotator控件看起來如下所示:
<asp:AdRotator ID="AdRotator1" runat="server" DataSourceID="ProductPhotos" />

這裏的所有屬性(除了DataSourceID及其名字外)都爲其缺省值,因爲我已經在DataSource的定義中使用缺省名來描述這些域。
(二) XML模式
另一種填充一個AdRotator的域的方式是使用一個靜態XML文件,它有一個類似於表格模式的結構。本文下載源碼中包含一個完整的示例。下面是一個簡單摘要(一個稱爲Advertisments.xml的文件):
<Ad>
  <ImageUrl>~/ProductThumbNail.ashx?ID=70</ImageUrl>
  <NavigateUrl>~/ProductPhoto.ashx?ID=70</NavigateUrl>
  <AlternateText>Product Number 70</AlternateText>
  <Impressions>100</Impressions>
</Ad>
現在,該AdRotator看起來如下所示:
<asp:AdRotator ID="AdRotator2" runat="server" AdvertisementFile="~/Advertisments.xml" />

在此,我們也是使用了缺省值。

(三) 編程模式
無論AdRotator的AdCreated事件何時激發,都以編程方式填充該屬性。此時,一個AdCreatedEventArgs對象被傳遞到事件處理器;而且你要設置三個屬性:ImageURL,NavigateURL和AlternateText—它們都是用於生成控件之用的。
至此,該AdRotator控件看起來如下所示:
<asp:AdRotator ID="AdRotator3" runat="server" OnAdCreated="AdRotator3_AdCreated"/>

在code-behind文件中,我僅綁定了一個事件處理器:
protected void AdRotator3_AdCreated(object sender, AdCreatedEventArgs e) ...{
  int ProductID = 1;
  e.ImageUrl = "~/ProductThumbNail.ashx?ID=" + ProductID.ToString();
  e.NavigateUrl = "~/ProductPhoto.ashx?ID=" + ProductID.ToString();
  e.AlternateText = "以編程方式從產品ID生成文本 " + ProductID.ToString();
}


這種情況可能非常有用。例如,你可以實現基於用戶的導航歷史,或基於他們已經實現的個性化或任何其它標準來實時的圖像定位
二、 動態圖像生成問題
至此,我們已經分析了AdRotator類直接使用指向圖像文件的URL,而不是字節流或二進制數組數據或任何其它可能描述一個圖像的形式。當該圖像以二進制數據形式存儲在一個數據庫文件中時,這就提出了一個問題。一般地,你是不想把它們寫向磁盤的,因爲它們將再次佔用很多的空間並且需要與數據庫版本保持同步。幸運的是,在Visual Studio 2005中,這一切變得相當容易。
從根本上看,我們需要創建一個HTTP處理器類,它將攔截到一個特定的URL的調用並且以一種瀏覽器期望的格式返回該圖像。有關IHTTPHandler接口,在此不再贅述,請參考MSDN文檔。HTTP處理器給你提供一種與低級請求和IIS Web服務器的響應服務交互的方式,並且提供一種很類似於ISAPI擴展的功能,只是使用一種更爲簡單的編程模型。
下面是其中一個處理器類(ProductThumbNail.ashx)相應的代碼。其它的與此基本一致,除了使用一個不同的TableAdaptor來檢索較大的圖像外。
<%@ WebHandler Language="C#" Class="ProductThumbNail" %>
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;
using System.Web.Caching;
using System.Data;
using System.Data.Sql;
using System.Web.UI.WebControls;
using System.Web.Configuration;
using System.Configuration;
using System.Collections;
public class ProductThumbNail : IHttpHandler
...{
  public void ProcessRequest (HttpContext context)...{
    //從querystring中得到圖像的ID,並且使用它生成一個緩存鍵。
    String imageID = context.Request.QueryString["ID"];
    String cacheKey = context.Request.CurrentExecutionFilePath + ":" + imageID;
    Byte[] imageBytes;
    //檢查是否緩存中包含圖像
    Object cachedImageBytes = context.Cache.Get(cacheKey);
    if (cachedImageBytes != null) ...{
      imageBytes = (Byte[])cachedImageBytes;
    }
    else ...{
      GetImageTableAdapters.ThumbNailTableAdapter oTA = new GetImageTableAdapters.ThumbNailTableAdapter();
      GetImage.ThumbNailDataTable oDT = oTA.GetData(int.Parse(imageID));
      if (oDT.Rows.Count == 0) ...{
        //圖像編號
        //Photo ID爲1顯示“No Image Available”圖像
        oDT = oTA.GetData(1);
      }
      imageBytes = (byte[])oDT.Rows[0]["ThumbNailPhoto"];
      //把它存儲在緩存中(2個小時以後到期)
      context.Cache.Add(cacheKey,imageBytes,null,
        DateTime.MaxValue,new TimeSpan(2,0,0),
        CacheItemPriority.Normal,null);
    }
    //回發圖像
    context.Response.ContentType = "image/jpeg";
    context.Response.Cache.SetCacheability(HttpCacheability.Public);
    context.Response.BufferOutput = false;
    context.Response.OutputStream.Write(imageBytes,0,imageBytes.Length);
  }
  public bool IsReusable...{
    get ...{return false;}
  }
}在IHTTPHandler接口中實現的重要方法是ProcessRequest()。它能使你以低級方式存取上下文對象;該上下文對象又進一步存取Request和Response對象以便你能夠得到作爲一個查詢字符串傳遞到URL中的ID(藉助於Request),並且藉助於Response對象返回內容。返回的內容僅僅是一個從表格中的二進制欄中獲取的字節數組。注意,我僅取得在第一行的ThumbNailPhoto欄中的內容並且把它轉換爲一個字節數組。
另外,爲了往回發送圖像,你只需要設置一下content type(注意,這可能來自於表格,或者由二進制形式的頭部來動態決定),它負責告訴Response對象把數據“流回”,而不必等待數據流關閉,然後僅把字節數組寫向輸出流。

三、 小結
如今,大多數網站經常顯示各式廣告或邀請用戶訪問其他站點的類似動態內容。而ASP.NET 2.0中提供的AdRotator控件正可簡化此任務。在當今IT廣告世界裏,這個小小的“精靈”控件將發揮越來越大的作用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章