2009-02-19 51 views
20

如何使用ASP.NET MVC实现每页刷新的旋转广告块,类似于SO的做法?如何在ASP.NET MVC中创建旋转广告块?

您是否认为他们有一个会话变量以及我们当前正在查看的广告索引,并循环每个请求或其他内容?

+0

我看不出有什么问题。 – 2009-02-19 07:28:49

+0

@ [KingNestor]:改名非常好,谢谢;现在这是一个普遍的问题。你的城堡现在用石头代替沙子制成。 – 2009-02-19 16:29:50

+2

沙堡没有什么问题,除了朋克小孩在四处踢砸他人的日子。 – ceejayoz 2009-02-19 19:17:00

回答

16

我会用OpenXDARTGoogle Ad ManagerRightMediaRubicon,或其他一些广告经理。

但是,如果我想自己建立它作为一个练习,我想:

  1. 创建广告
  2. 在我的基本控制器的数据库表中,选择一个随机的广告到ViewData的
  3. 添加局部视图,以你的母版页来呈现广告
  4. [最重要]使用菲尔哈克的MVC风格的“donut caching
版本

这与您将用于显示循环报价,随机推荐用户或您希望在每个页面上显示的任何其他随机内容的方法相同。

1

您可以生成一个随机数字,并将其用作要显示的广告的数组键,但无法确保均匀曝光,并且在交换货币时会导致很多问题。一个为此目的而构建的应用程序是OpenX。这提供了真正深入的统计数据,它还允许您设置每个广告需要显示多少等。它非常强大,许多商业网站都使用它来管理他们的广告。

0

我不得不在MVC中写一些加权广告控件,如果可能的话,它不会连续两次显示同一个广告,并且在我的匆忙中,我最终得到了可怕的代码作为灵感。

我敢肯定有很多更好的方法可以做到这一点(而且我已经知道这种情况下,当它不应该重复时),但是我花了很短的时间就完成了这项工作。

public List<Ad> GetRandomWeightedAds() 
    { 
     /* Generate random order list of ads with duplicates for ViewsPerRotation */ 
     List<Ad> returnList = GetAllAds().SelectMany(s => Enumerable.Repeat(s, s.ViewsPerRotation)).OrderBy(s => Guid.NewGuid()).ToList(); 
     for (int i = 0; i < returnList.Count - 1; i++) /* Compare all but the last element against subsequent element */ 
     { 
      if (returnList[i].Id == returnList[i + 1].Id) 
      { 
       /* If next to an identical element try and find a new spot for the subsequent element */ 
       for (int j = 0; j < returnList.Count; j++) 
       { 
        if (returnList[j].Id != returnList[i].Id /* Don't switch identical element back into same pos*/ 
         && (j<i || j == 0 || j-1 == i || returnList[i].Id != returnList[j - 1].Id) /* When moving before current 'i', don't move into a place after an identical element */ 
         && (j<i || j == returnList.Count - 1 || j + 1 == i || returnList[i].Id != returnList[j + 1].Id)) /* When moving before current 'i', don't move into a place before an identical element */ 
        { 
         returnList[i] = returnList[j]; 
         returnList[j] = returnList[i+1]; /* returnList[i+1] == returnList[i] */ 
         break; 
        } 
       } 
      } 
     } 
     return returnList; 
    }