我创建了一个母版页,它使用了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分配不同的文件。但是,这会导致给定广告始终位于同一位置,可能或我不是页面上的“高级”位置。
答案 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;
}