Asp.NET - AdRotator的多个实例

时间:2009-08-30 03:52:19

标签: asp.net

我创建了一个母版页,它使用了3个System.Web.UI.WebControls.AdRotator实例,每个实例都由相同的ad元素XML文件支持。例如,

<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分配不同的文件。但是,这会导致给定广告始终位于同一位置,可能或我不是页面上的“高级”位置。

2 个答案:

答案 0 :(得分:0)

  

AdRotator并非旨在显示一系列横幅,因此如果您在Web窗体上放置多个AdRotator控件并将它们指向同一个AdvertisementFile,则无法阻止重复。

AdRotator仅用于提供大多数基本广告功能。它绝对不是为了与“真正的”广告服务系统竞争或取代它。如果你需要更复杂的东西,你需要调查第三方系统或自己动手。

答案 1 :(得分:0)

尽管由于其固有的限制,我第二次推荐Rex M建议推出自己的AdRotator,但有一种方法可以在旋转器的AdCreatedEvent中执行此操作。对于3个或更多旋转器,请尝试http://tinyurl.com/7rymect中概述的概念(必须滚动到页面底部才能看到答案)。否则,您可以在页面上使用2个AdRotators尝试这些内容:

/// <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;
}