2009-08-30 57 views
1

我已經創建了一個母版頁,它使用3個System.Web.UI.WebControls.AdRotator實例,每個實例都由相同的廣告元素XML文件支持。例如,Asp.NET - AdRotator的多個實例

<asp:adRotator AdvertisementFile="/ads.xml" Runat="server"/> 

*** ads.xml *** 
<Advertisements> 
    <Ad> 
     <ImageUrl>/Path/Banner.gif</ImageUrl> 
     <NavigateUrl>http://www.google.com</NavigateUrl> 
     <AlternateText> 
     The best search engine in the world! 
     </AlternateText> 
     <Impressions>3</Impressions> 
    </Ad> 
</Advertisements> 

問題是有時候同一個廣告會在給定的時刻出現在2個或更多的AdRotators中。

什麼是讓廣告在任何特定時間呈現獨一無二的最佳方式?一種可能性是將廣告分成3個不同的XML文件,併爲每個AdRotator分配一個不同的文件。但是,這會導致指定的廣告始終位於可能或不是網頁上「高級」位置的相同位置。

回答

0

AdRotator並未設計爲顯示一系列橫幅,因此如果將多個AdRotator控件放在Web窗體上並將它們指向相同的AdvertisementFile,則無法防止重複項。

AdRotator只設計用於提供大多數基本廣告功能。絕對不打算與競爭或取代「真正的」廣告投放系統。如果您需要更詳細的內容,您需要查看第三方系統或推出自己的系統。

0

雖然我第二次雷克斯M的建議推出自己的AdRotator由於其固有的侷限性,有一種方法可以在旋轉器的AdCreatedEvent內完成此操作。對於3個或更多旋轉器嘗試概念http://tinyurl.com/7rymect(必須滾動到頁面底部才能看到答案)概念。否則,您可以在頁面上使用2個AdRotator嘗試以下內容:

/// <summary> 
/// First ad rotator control 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
protected void AdRotator_AdCreated(object sender, AdCreatedEventArgs e) 
{ 
    //Get displayed ad's id 
    int currentAd = (int)e.AdProperties["AdId"]; 

    //Remove that ad from the list 
    TList<Banner> ads = GetBannerThatIsNotThisAdId(currentAd, AdRotator.KeywordFilter); 

    //Do we have an ad to display? 
    if (ads.Count > 0) 
    { 
     AdRotator1.DataSource = ads; 
     AdRotator1.DataBind(); 
    } 
    else //nope, so hide 2nd control 
    { 
     AdRotator1.Visible = false; 
    } 
} 

public static TList<Banner> GetBannerThatIsNotThisAdId(int adId, string pCategory) 
{ 
    BannerService bannerService = new BannerService(); 
    TList<Banner> banners = bannerService.GetAll(); 
    Banner banner = bannerService.GetByAdId(adId); 

    banners.ApplyFilter(delegate(Banner b) { return b.Keyword.Equals(pCategory) && (b.IsActive.Equals(true)); }); 

    banners.Remove(banner); 

    return banners; 
}