数据库驱动的旗帜旋转控制

分享于 

40分钟阅读

Web开发

  繁體

介绍

在本文中,我将介绍我的旗帜旋转控制。 它的思想与 ASP.NET AdRotator控件的思想不同。 这里控件的数据库驱动器,横幅在特定时间内旋转。 每个横幅将有一个显示时间( 以秒为单位) 移动到下一个横幅( JavaScript在客户端执行旋转)。

源代码 (ASP.NET 服务器控制项目和用于测试控件的ASP.NET 网站在本文的顶部附加。 我将逐步解释,如下所示:

  • 控制功能
  • 如何使用它
  • 使用控件的不同方法
  • ASP.NET 服务器控件的说明( 类库)

控制功能

  • 数据库驱动: 如宽度。高度和可以点击的旗帜规格,从数据库中得到,所以横幅列表也会被显示。 横幅从数据库加载一次,它们在客户端上旋转。
  • 支持最高图像格式 (。JPG,GIF,BMP和 PNG,以及 Flash 文件( swf ) ) )。
  • 在该控件中,用户可以启用缓存并指定缓存期限。 这将减少数据库的负载。
  • 每个横幅的计数器功能。
  • 支持多种语言。
  • 开发人员可以自定义的完全可以自定义 用户可以根据页面 URL。QueryString 和任何用户定义条件指定标题区域,以控制显示的方式,垂直和水平重复标题区域,并指定横幅显示条件。

如何使用它

  • 将DLL文件" BannerRotatorControl.dll"复制到 ASP.NET"of的申请"文件夹中。
  • register 页中的控件:
  • <%@RegisterTagPrefix="BMS"Namespace="BannerRotatorControl"Assembly="BannerRotatorControl"%>
  • 在ASPX页中使用它,如下所示:
  • <BMS:BannerRotatorrunat="server"ID="banner1"ConnectionString="<%$ ConnectionStrings:bms_db %>"BannersLanguage="en"LocationCode="TOP"BannerImagesURL="<%$ appSettings:bms_data %>"BannerClickFile="~/click.aspx"ScriptsPath="/scripts/"ShowOnlyActivatedBanners="true"/>

要设置 BannerRotator 控件,有五个必需的属性:

  • ConnectionString: 包含标题控制表的数据库的连接字符串。 ( 文件 bms_db.mdf,bms_db.ldf 包含在源代码中。 )
  • BannersLanguageLocationCode: 这些是必需的属性。 它们是通知 BannerRotator 根据下表从数据库读取数据的主要属性:
  •  03. jpg

    BMS_BANNERS_AREAS 包含标题区域列表。 在 上面 ASP.NET 控件中,我设置了 BannersLanguage="en" LocationCode="TOP" 控件指示控件读取 lang="en"location_code="TOP" ( 突出显示一个)的标题区域记录,并根据这些记录字段中指定的信息绘制标题区域:

    • Widthpx
    • Heightpx
    • NoAds_image: 这将控制要保留的横幅区域,即使这个区域没有横幅。

     01. jpg

    语言的主 table

     02. jpg

    包含位置列表( 位置表示页面位置- 左。右。顶和底)的主 table
  • BannerImagesURL: 这里属性告诉控件横幅图像文件位置 URL。 在:的appSettings 键中,我已经设置了属性,以便读取:
  • <addkey="bms_data"value="http://localhost/biznet-data/bms_test/{0}/banners/"/>

    " biznet数据"是在IIS中创建的虚拟目录,指向文件夹" c:Biznet_databms_testenbanners"。 请注意,我使用了的 {0} 来替换标题语言。

上面 ASP.NET 控件代码中的其他一些属性包括:

  • BannerClickFile: 这将指定横幅是否可以点击。 这是 ASP.NET 网站中文件单击ASPX页面的路径。 在这里,你可以编写用于更新标题点击计数并重定向到指定URL链接的代码:
  • protectedvoid Page_Load(object sender, EventArgs e)
    {
     string urlstr = BannerRotatorControl.BannerRotator.UpdateBannerClick(
     ConfigurationManager.ConnectionStrings["bms_db"].ToString());
     if (!string.IsNullOrEmpty(urlstr))
     Response.Redirect(urlstr);
    }
  • ScriptsPath: 如果你计划在标题控件中使用 Flash 文件,这个属性很重要。 你应该为 Flash 加载程序指定 Flash JavaScript脚本路径:
  •  04. jpg

  • ShowOnlyActivatedBanners :如果要仅显示激活的横幅,或者 false 显示所有横幅( 如果你使用横幅管理管理站点中的旗帜旋转器,则设置为 false ),请将这里设置为 true。

使用BannerRotator控件的不同方法

可以在不同的场景中使用控件;我将列出最常见的控件:

  • 旋转多个横幅的 banner

如果你想在这个区域中添加一个"广告空间"图像,那么在这个场景的顶部要有一个标题区域( 468 X 60像素),它显示一个图像。 否则,它将显示横幅并根据为每个横幅指定的显示时间( 以秒为单位) 旋转它们。

BannerRotator 控制代码将是:

<BMS:BannerRotatorrunat="server"ID="banner1"ConnectionString="<%$ ConnectionStrings:bms_db %>"BannersLanguage="en"LocationCode="TOP"BannerImagesURL="<%$ appSettings:bms_data %>"BannerClickFile="~/click.aspx"ScriptsPath="/scripts/"ShowOnlyActivatedBanners="true"Repeat="NoRepeat"/>

 06. jpg

控件基于控件中设置的属性,将读取上述记录,因为" Repeat"属性设置为" NoRepeat",因此将选择由" ls_order"字段升序排列的顶级记录。 横幅显示的结果如下:

 bcci_en_noad468x60.jpg

因为在"bms_banners"table 中没有添加横幅,而且" NoAds_image"字段也不是空的,这将告诉标题保留该域中的图像。

我们在这里记录的"bms_banners"table 中添加横幅记录,如下图所示:

 07. jpg

根据 上面 记录图像,横幅旋转控件将开始显示横幅并根据列表顺序" ls_order"旋转它们。

  • 将显示的第一幅横幅为" BCCI_en_ad_eztrade468X60.jpg" 3秒,因为" link_url"设置为" http://www.eztrade.bh/",它将可以单击。
  • 第二个标题是" bcci_en_shops_eztrade.gif",显示 2秒,因为" link_url"是空的,所以它不会被点击。
  • 最后一个是" bcci_en_banner1.swf"( 一个 Flash 横幅),显示为 7秒。
  • 然后它会再次循环。
  • 用单个横幅为多个横幅区域添加

在这里场景中,我们希望在页面左侧显示四个相等大小的横幅( 202 X 96像素) 并垂直列出。 它们是不可点击的。

首先,在"bms_banners_areas"table 中添加四个记录,如下所示:

 08. jpg

然后,在ASPX页中添加代码,如下所示:

<BMS:BannerRotatorrunat="server"ID="BannerRotator1"ConnectionString="<%$ ConnectionStrings:bms_db %>"BannersLanguage="en"LocationCode="LFT"ScriptsPath="/scripts/"BannerImagesURL="<%$ appSettings:bms_data %>"Repeat="RepeatY"VerticalSpacing="5"ShowOnlyActivatedBanners="true"/>

代码 上面 将读取所有带 location_code="LFT"lang="en"的记录,由" ls_order"排序,因为" Repeat"属性设置为" RepeatY"( 垂直列表)。 因为所有记录在" NoAds_image"字段中都有空值,所以它不会保留任何标题区域。 它将只显示在该区域添加的横幅,如果有的话。

我们在"bms_banners"table 中为上面的每个标题区域添加一个横幅记录:

 09. jpg

根据 上面 记录,横幅控件的结果将如下所示:

 10. jpg

我已经将" VerticalSpacing"属性设置为" 5"。

  • 多重保留多个横幅区域的多个保留横幅区域

在这个场景中,我们希望在页面的右侧有三个大小不同的标题区域。 前两个横幅区域大小为 157像素,第third像素为 157像素。 我们要垂直列出它们。 如果没有添加横幅,所有这些都应该显示"广告空间"图像。

代码将为:

<BMS:BannerRotatorrunat="server"ID="BannerRotator2"ConnectionString="<%$ ConnectionStrings:bms_db %>"BannerImagesURL="<%$ appSettings:bms_data %>"BannersLanguage="en"LocationCode="RGT"Repeat="RepeatY"VerticalSpacing="5"ShowOnlyActivatedBanners="true"BorderWidth="1"BorderColor="Red"BorderStyle="Solid"BannerClickFile="~/click.aspx"/>

 11. jpg

根据记录,横幅控件将显示三个带有"广告空间"图像的标题区域。 因为" NoAds_image"字段对所有它们都不是空的,所以它们还没有添加任何横幅,结果如下:

 12. jpg

我们在第一个标题区域的"bms_banners"table 中添加两个记录:

 13. jpg

根据 上面 记录图像,横幅旋转控件将开始显示横幅并根据列表顺序" ls_order"( 第一个标题区域) 旋转它们。

  • 第一个横幅将显示为" bcci_en_btn.jpg" 4秒,它将被点击,因为"link_url"被设置为"http://www.bahraintradanet.com/".
  • 第二个横幅是" bcci_en_gtn.jpg" 6秒,因为"link_url"被设置为"http://www.gulftradanet.com/".,它将被点击
  • 然后它会再次循环。
  • 在横幅区域中按条件显示横幅

在这个场景中,我们将采取第一个方案,并添加一些高级功能。 我们希望基于" PageURL"。" QueryString"。" Session"。" Cookies"和" UserDefined"来控制横幅的显示。

我提到 上面,最上面的横幅有三个横幅: banner_id=14,banner_id=15和banner_id=16只要页面URL为" /BannerRotator_test/default.aspx"时,我们希望显示 banner_id=14,当我们有查询字符串"q=1"时。

 14. jpg

ASP.NET 代码:

<BMS:BannerRotatorBannersLanguage="en"ConnectionString="<%$ 
 ConnectionStrings:bms_db %>"LocationCode="TOP"ScriptsPath="/scripts/"runat="server"ID="banner1"BannerImagesURL="<%$ appSettings:bms_data %>"BannerClickFile="~/click.aspx"ShowOnlyActivatedBanners="true"Repeat="NoRepeat"><BMS:BannerDisplayCheckParameterType="PageURL"/><BMS:BannerDisplayCheckParameterType="QueryString"ParameterName="q"/><BMS:BannerDisplayCheckParameterType="Session"ParameterName="my_session"/><BMS:BannerDisplayCheckParameterType="Cookie"ParameterName="my_cookie"/><BMS:BannerDisplayCheckParameterType="UserDefined"/></BMS:BannerRotator>

" BannerDisplayCheck"参数将告诉横幅旋转器检查"bms_banner_display_criterias"table,并根据匹配条件比较值并显示横幅。 以下是参数类型和用法:

  • PageURL: 这将告诉标题控件使用等于查找" BMS_BANNER_DISPLAY_CRITERIAS",并比较当前ASPX页面URL与" criteria_value"字段。 如果匹配,则可以显示此行的banner_id
  • 它将告诉标题控件使用等于" QueryString"查找" BMS_BANNER_DISPLAY_CRITERIAS",并检查当前ASPX页面 URL QueryString NAME 匹配" ParameterName"。 然后,将 QueryString 值与" criteria_value"字段进行比较。 如果匹配,则可以显示此行的banner_id
  • 这个命令会告诉标题控件使用与" Session"相同的值查找" BMS_BANNER_DISPLAY_CRITERIAS",并检查是否有与" ParameterName"相同的会话对象。 然后将会话对象值与" criteria_value"字段进行比较。 如果匹配,则可以显示此行的banner_id
  • 这个命令会告诉标题控件使用与" Cookie"相同的值查找" BMS_BANNER_DISPLAY_CRITERIAS",并检查是否存在与" ParameterName"相同的NAME 对象。 然后将cookie对象值与" criteria_value"字段进行比较。 如果匹配,则可以显示此行的banner_id
  • 这将告诉banner控件使用等于" UserDefined"查找" BMS_BANNER_DISPLAY_CRITERIAS",并将用户输入的值与" criteria_value"字段的" UserDefinedParameterValue"属性中的值比较。 如果匹配,则可以显示此行的banner_id

类库

控件的思想是从数据库获取横幅,并根据每个标题的指定时间对它的进行旋转。 最初,我使用AJAX来完成工作。 我使用了 AJAX TimerUpdatePanel 控件。 我使用计时器计时事件来显示下一个标题。 因为它占用了服务器和带宽的大量资源,这是一个非常糟糕的方法。 UpdatePanel的最大缺点是它仍然来回发送所有的viewstate,因此你使用了大量带宽。 页面生命周期中的另一个仍然可以运行。

我继续使用AJAX与 Web服务 进行更好的性能和更少的带宽使用,并在浏览器中返回JSON数据并在页面中注入 HTML。 这个增强的性能,但我并不高兴,因为每次计时计时事件,我不得不从数据库中读取下一个标题记录。

这个控件,从数据库中读取所有横幅,并生成HTML和 JavaScript,在客户端使用JavaScript函数进行旋转,从而完成旋转。 这在控件" RenderContents"事件中完成。 below 是生成的横幅旋转代码的示例:

<divid="Banner115"></div>
<script type="text/javascript">
 var BannerHtml_arr15= new Array();
 var swfId_arr15 = new Array();
 var DisplayTimeSeconds_arr15 = new Array();
 var banner_count15 =0;
 var BannerHtml15=null;
 var swfId15=null;
 var BannerIndex15=0;
 banner_count15=3//array items generated from the database BannerHtml_arr15[0]="<a href='http://www.codeproject.com/BannerRotator" + 
 "_test/click.aspx?clickid=6418cd46-791a-40e1-9c11-e3e732977" + 
 "dc2452¶ms=PageURL%7c%2fBannerRotator_test%2fDefault" + 
 ".aspx' target='_blank' title='Eztrade.bh'><img" + 
 " src='http://localhost/biznet-data/bms_test/en/banners/" + 
 "BCCI_en_ad_eztrade468X60.jpg' style='border:Solid" + 
 "0px black;' width='468' height='60'></a>";
 swfId_arr15[0]='';
 DisplayTimeSeconds_arr15[0]='3000';
 BannerHtml_arr15[1]="<img src='http://localhost/biznet-data/" + 
 "bms_test/en/banners/bcci_en_shops_eztrade.gif' style='border:" + 
 "Solid 0px black;' width='468' height='60' title='Eztrade Shops'>";
 swfId_arr15[1]='';
 DisplayTimeSeconds_arr15[1]='2000';
 BannerHtml_arr15[2]="";
 swfId_arr15[2]='http://localhost/biznet-data/bms_test/en/banners/bcci_en_banner1';
 DisplayTimeSeconds_arr15[2]='7000';
 function DisplayBanner15()
 {
 if (BannerHtml15!=null || swfId15!=null)
 {
 if (BannerHtml15!=null) {
 document.getElementById('Banner115').innerHTML =BannerHtml15;
 }
 elseif (swfId15!=null) {
 //loading flash object using java script.var lcId15 = new Date().getTime();
 var flashProxy15 = new FlashProxy(lcId15, 
 '/BannerRotator_test/scripts/JavaScriptFlashGateway.js');
 var flashObject15 = new FlashTag(swfId15+'.swf',468,60, '8,0,0,0');
 flashObject15.setFlashvars('lcId=' + lcId15);
 flashObject15.write(document.getElementById('Banner115'));
 }
 }
 if (banner_count15>1)
 setTimeout('DisplayBanner15()', 
 DisplayTimeSeconds_arr15[BannerIndex15],'JavaScript')
 BannerIndex15++;
 if (BannerIndex15> = banner_count15)
 BannerIndex15=0;
 SetValues15();
 }
 function SetValues15()
 {
 if (BannerHtml_arr15[BannerIndex15]!=null && BannerHtml_arr15[BannerIndex15]!='')
 BannerHtml15 = BannerHtml_arr15[BannerIndex15];
 else BannerHtml15 = null;
 if (swfId_arr15[BannerIndex15]!=null && swfId_arr15[BannerIndex15]!='')
 swfId15 = swfId_arr15[BannerIndex15];
 else swfId15 = null;
 }
 function LoadBanners15()
 {
 if (BannerIndex15==0)
 {
 SetValues15();
 DisplayBanner15();
 }
 }
 LoadBanners15();
</script>

开始之前,下面是标题控制数据库的屏幕截图:

 05. jpg

代码从控件的" RenderContents"事件中调用。 首先,通过调用以下函数来获取标题区域列表:

protected DataTable GetBannerArea()
{
 DataTable retVal = null;
 string sql = "select";
 //selecting a single record (first record based on order of"ls_order" column)if (_Repeat == RepeatOptions.NoRepeat)
 sql += "top 1";
 sql += " * from BMS_BANNERS_AREAS where location_code=@location_code" + 
 " and lang=@lang and Active_flag='1' order by ls_order";
 SqlConnection conn = new SqlConnection(_ConnectionString);
 SqlDataAdapter da = new SqlDataAdapter(sql, conn);
 try {
 da.SelectCommand.Parameters.AddWithValue("location_code", _LocationCode);
 da.SelectCommand.Parameters.AddWithValue("lang", _lang);
 DataTable dt = new DataTable();
 if (_EnableCaching)
 {
 DataTable dt_c = HttpContext.Current.Cache["AdRotator_" + 
 _Repeat.ToString() + "_" + 
 _LocationCode + "_" + _lang] as DataTable;
 if (dt_c!= null)
 dt = dt_c;
 else {
 da.Fill(dt);
 HttpContext.Current.Cache.Insert("AdRotator_" + 
 _Repeat.ToString() + "_" + _LocationCode + "_" + 
 _lang, dt, null, 
 DateTime.Now.AddMinutes(_CacheDuration), TimeSpan.Zero);
 }
 }
 else da.Fill(dt);
 da.Dispose();
 conn.Dispose();
 retVal = dt;
 }
 catch (Exception ex)
 {
 thrownew Exception("Exception Accured in : protected" + 
 " void GetBannerArea(). For More Details" + 
 "See Inner Exception Message", ex);
 }
 return retVal;
}

上面 函数将基于" Location_code"和" Lang"从"bms_banners_areas"table 检索标题区域。 每一行都将定义一个带有维度的标题区域。 我调用函数以获得结果的DataTable

//initially we get the list of banner areas in a datatableDataTable dt_banner_areas = GetBannerArea();

然后,我循环遍历记录以呈现HTML和JavaScript代码。 参考上面生成的示例。

//loop through the banner areasforeach (DataRow dr in dt_banner_areas.Rows)
{
 // assigning values _banner_area_id = Convert.ToString(dr["banner_area_id"]);
 _Width = Convert.ToString(dr["widthpx"]);
 _Height = Convert.ToString(dr["hieghtpx"]);
 if (!string.IsNullOrEmpty(Convert.ToString(dr["NoAds_image"])))
 _NoAdFile = string.Format(_bms_data_url, _lang) + 
 Convert.ToString(dr["NoAds_image"]);
 _NoAdAlt = Convert.ToString(dr["NoAds_imageAlt"]);
 //again check the banner areas count for doing //the html table. and placing the banner areas.if (dt_banner_areas.Rows.Count >1)
 {
 if (_Repeat == RepeatOptions.RepeatX)
 sb.Append("" + Environment.NewLine);
 elseif (_Repeat == RepeatOptions.RepeatY)
 sb.Append("" + Environment.NewLine);
 }
 //start doing the html and javascript. better you view source//of the aspx page to see the resulted html. sb.Append(@"<div id=""Banner1" + 
 _banner_area_id + @""">" + Environment.NewLine);
 sb.Append("</div>" + Environment.NewLine);
 //writing up the javasctript that will do the banner rotation. sb.Append(@"<script type=""text/javascript"">" + 
 Environment.NewLine);
 sb.Append(@"var BannerHtml_arr" + _banner_area_id + 
 "= new Array();" + Environment.NewLine);
 sb.Append(@"var swfId_arr" + _banner_area_id + 
 " = new Array();" + Environment.NewLine);
 sb.Append(@"var DisplayTimeSeconds_arr" + _banner_area_id + 
 " = new Array();" + Environment.NewLine);
 sb.Append(@"var banner_count" + _banner_area_id + 
 " =0;" + Environment.NewLine);
 sb.Append(@"var BannerHtml" + _banner_area_id + 
 "=null;" + Environment.NewLine);
 sb.Append(@"var swfId" + _banner_area_id + 
 "=null;" + Environment.NewLine);
 sb.Append(@"var BannerIndex" + _banner_area_id + 
 "=0;" + Environment.NewLine);
 // getting the generated javascript array list sb.Append(GenerateJavascriptArrayItems());
 sb.Append(@"function DisplayBanner" + 
 _banner_area_id + "()" + Environment.NewLine);
 sb.Append(@"{" + Environment.NewLine);
 // sb.Append(@"//alert(swfId" + _banner_area_id +");" + Environment.NewLine); sb.Append(@"if (BannerHtml" + _banner_area_id + 
 "!=null || swfId" + _banner_area_id + 
 "!=null)" + Environment.NewLine);
 sb.Append(@"{" + Environment.NewLine);
 sb.Append(@"if (BannerHtml" + _banner_area_id + "!=null) {" + Environment.NewLine);
 sb.Append(@"document.getElementById('Banner1" + 
 _banner_area_id + "').innerHTML =BannerHtml" + 
 _banner_area_id + ";" + Environment.NewLine);
 sb.Append(@"}" + Environment.NewLine);
 sb.Append(@"else if (swfId" + _banner_area_id + "!=null) {" + Environment.NewLine);
 sb.Append(@"//loading flash object using java script." + Environment.NewLine);
 sb.Append(@"var lcId" + _banner_area_id + 
 " = new Date().getTime();" + Environment.NewLine);
 sb.Append(@"var flashProxy" + _banner_area_id + 
 " = new FlashProxy(lcId" + _banner_area_id + ", '" + 
 VirtualPathUtility.ToAbsolute("~" + _JavaScriptFlashGateway_path + 
 "JavaScriptFlashGateway.js") + "');" + Environment.NewLine);
 sb.Append(@"var flashObject" + _banner_area_id + 
 " = new FlashTag(swfId" + _banner_area_id + 
 "+'.swf'," + _Width + "," + _Height + 
 ", '8,0,0,0');" + Environment.NewLine);
 sb.Append(@"flashObject" + _banner_area_id + 
 ".setFlashvars('lcId=' + lcId" + _banner_area_id + 
 ");" + Environment.NewLine);
 sb.Append(@"flashObject" + _banner_area_id + 
 ".write(document.getElementById('Banner1" + 
 _banner_area_id + "'));" + Environment.NewLine);
 sb.Append(@"}" + Environment.NewLine);
 sb.Append(@"}" + Environment.NewLine);
 sb.Append(@"if (banner_count" + _banner_area_id + ">1)" + Environment.NewLine);
 sb.Append(@"setTimeout('DisplayBanner" + _banner_area_id + 
 "()',DisplayTimeSeconds_arr" + _banner_area_id + 
 "[BannerIndex" + _banner_area_id + 
 "],'JavaScript')" + Environment.NewLine);
 sb.Append(@"BannerIndex" + _banner_area_id + "++;" + Environment.NewLine);
 sb.Append(@"if (BannerIndex" + _banner_area_id + 
 "> = banner_count" + _banner_area_id + 
 ")" + Environment.NewLine);
 sb.Append(@"BannerIndex" + _banner_area_id + "=0;" + Environment.NewLine);
 sb.Append(@"SetValues" + _banner_area_id + "();" + Environment.NewLine);
 sb.Append(@"}" + Environment.NewLine);
 sb.Append(@"function SetValues" + _banner_area_id + "()" + Environment.NewLine);
 sb.Append(@"{" + Environment.NewLine);
 sb.Append(@"if (BannerHtml_arr" + _banner_area_id + 
 "[BannerIndex" + _banner_area_id + 
 "]!=null && BannerHtml_arr" + _banner_area_id + 
 "[BannerIndex" + _banner_area_id + "]!='')" + Environment.NewLine);
 sb.Append(@"BannerHtml" + _banner_area_id + 
 " = BannerHtml_arr" + _banner_area_id + 
 "[BannerIndex" + _banner_area_id + 
 "];" + Environment.NewLine);
 sb.Append(@"else" + Environment.NewLine);
 sb.Append(@"BannerHtml" + _banner_area_id + " = null;" + Environment.NewLine);
 sb.Append(@"if (swfId_arr" + _banner_area_id + 
 "[BannerIndex" + _banner_area_id + 
 "]!=null && swfId_arr" + _banner_area_id + 
 "[BannerIndex" + _banner_area_id + "]!='')" + Environment.NewLine);
 sb.Append(@"swfId" + _banner_area_id + " = swfId_arr" + 
 _banner_area_id + "[BannerIndex" + 
 _banner_area_id + "];" + Environment.NewLine);
 sb.Append(@"else" + Environment.NewLine);
 sb.Append(@"swfId" + _banner_area_id + " = null;" + Environment.NewLine);
 sb.Append(@"}" + Environment.NewLine);
 sb.Append(@"function LoadBanners" + 
 _banner_area_id + "()" + Environment.NewLine);
 sb.Append(@"{" + Environment.NewLine);
 sb.Append(@"if (BannerIndex" + _banner_area_id + "==0)" + Environment.NewLine);
 sb.Append(@"{" + Environment.NewLine);
 sb.Append(@"SetValues" + _banner_area_id + "();" + Environment.NewLine);
 sb.Append(@"DisplayBanner" + _banner_area_id + "();" + Environment.NewLine);
 sb.Append(@"}" + Environment.NewLine);
 sb.Append(@"}" + Environment.NewLine);
 sb.Append(@"LoadBanners" + _banner_area_id + "();" + Environment.NewLine);
 sb.Append(@"</script>" + Environment.NewLine);
}

注意,我调用函数" GenerateJavascriptArrayItems"来生成JavaScript的array 项。 这个函数是获取在特定标题区域中添加的所有横幅记录的那个函数。

protectedstring GenerateJavascriptArrayItems()
{
 string retVal = null;
 // getting list of banner within an area banner.// based on the"_banner_area_id" DataTable dt = GetBannersWithinArea();
 int i = 0;
 if (dt.Rows.Count >0)
 {
 retVal += "banner_count" + _banner_area_id + "=" + 
 dt.Rows.Count.ToString() + 
 Environment.NewLine + Environment.NewLine;
 //loop through the bannersforeach (DataRow dr in dt.Rows)
 {
 //generate the banner GenerateBannerHTML(dr);
 retVal += "BannerHtml_arr" + _banner_area_id + 
 "[" + i.ToString() + "]="" + 
 _BannerHtml + "";" + Environment.NewLine;
 retVal += "swfId_arr" + _banner_area_id + "[" + 
 i.ToString() + "]='" + _swfId + 
 "';" + Environment.NewLine;
 retVal += "DisplayTimeSeconds_arr" + _banner_area_id + 
 "[" + i.ToString() + "]='" + 
 _DisplayTimeSeconds + "';" + 
 Environment.NewLine + Environment.NewLine;
 i++;
 //nullfy the values for next banner usage _BannerHtml = null;
 _swfId = null;
 _DisplayTimeSeconds = 0;
 }
 }
 else {
 //generate and empty banner. (just the banner area block //with advertizing space image if provided) GenerateBannerHTML(null);
 retVal += "BannerHtml_arr" + _banner_area_id + "[0]="" + 
 _BannerHtml + "";" + Environment.NewLine;
 retVal += "swfId_arr" + _banner_area_id + "[0]='" + 
 _swfId + "';" + Environment.NewLine;
 retVal += "DisplayTimeSeconds_arr" + _banner_area_id + 
 "[0]='" + _DisplayTimeSeconds + "';" + 
 Environment.NewLine + Environment.NewLine;
 }
 return retVal;
}

在 上面 函数中,我调用另一个函数" GetBannersWithinArea"来获取特定横幅区域的横幅,然后遍历记录以生成 JavaScript array 项。 我调用另一个函数" GenerateBannerHTML"。 这个函数将把HTML标记分配给变量" _BannerHtml"。

protected DataTable GetBannersWithinArea()
{
 DataTable retVal = null;
 //generating sql statement for selecting the bannersstring sql = "select * from BMS_BANNERS";
 sql += " where banner_area_id=" + _banner_area_id;
 //check for banner start date and expiry date sql += " and CONVERT(varchar(10),expiry_date,121)" + 
 ">=CONVERT(varchar(10),getdate(),121)";
 sql += " and CONVERT(varchar(10),getdate(),121)" + 
 ">=CONVERT(varchar(10),start_date,121)";
 //apply banner display condition based //on the user define parameters in the control.string BannerDisplaySqlConditions = GetBannerDisplaySqlConditions();
 if (!string.IsNullOrEmpty(BannerDisplaySqlConditions))
 sql += BannerDisplaySqlConditions;
 if (_ShowOnlyActivatedBanners)
 sql += " and active_flag='1'";
 sql += " order by ls_order";
 SqlConnection conn = new SqlConnection(_ConnectionString);
 SqlDataAdapter da = new SqlDataAdapter(sql, conn);
 DataTable dt = new DataTable();
 try {
 //applying cache if applicable.if (_EnableCaching)
 {
 string c_BannerDisplaySqlConditions = null;
 if (!string.IsNullOrEmpty(BannerDisplaySqlConditions))
 {
 c_BannerDisplaySqlConditions = BannerDisplaySqlConditions.Replace("", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace("'", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace(">", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace("<", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace("(", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace(")", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace(":", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace("/", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace(@"", "_");
 c_BannerDisplaySqlConditions = c_BannerDisplaySqlConditions.Replace("=", "_");
 }
 //get data from cache if exists DataTable dt_c = HttpContext.Current.Cache["AdRotator_" + _banner_area_id + 
 "_" + _ShowOnlyActivatedBanners + "_" + 
 c_BannerDisplaySqlConditions] as DataTable;
 if (dt_c!= null)
 dt = dt_c;
 else {
 //or get it from database and store it in the cache for later retrieval. da.Fill(dt);
 HttpContext.Current.Cache.Insert("AdRotator_" + _banner_area_id + 
 "_" + _ShowOnlyActivatedBanners + "_" + 
 c_BannerDisplaySqlConditions, dt, null, 
 DateTime.Now.AddMinutes(_CacheDuration), TimeSpan.Zero);
 }
 }
 else da.Fill(dt);
 da.Dispose();
 retVal = dt;
 }
 catch (Exception ex)
 {
 throw ex;
 }
 finally {
 conn.Dispose();
 }
 return retVal;
}

上面 函数将基于" banner_area_id"从 table"bms_banners"检索标题记录。

我还想提到,我已经实现了一个属性 Collection。 这些是我在上面的标题"有条件地在横幅区域中显示横幅"下提到的" BannerDisplayCheck"参数。

为此,我创建了一个单独的类,BannerDisplayCheck

using System;using System.Collections;using System.ComponentModel;using System.Web.UI;namespace BannerRotatorControl
{
 [TypeConverter(typeof(ExpandableObjectConverter))]
 publicclass BannerDisplayCheck
 {
 publicenum CriteriaTypes
 {
 PageURL, QueryString, Session, Cookie, UserDefined
 }
 protected CriteriaTypes _criteraType = CriteriaTypes.PageURL;
 protectedstring _CriteriaName = null;
 public BannerDisplayCheck()
 : this(CriteriaTypes.PageURL, string.Empty)
 {
 }
 public BannerDisplayCheck(CriteriaTypes CriteriaType, string Name)
 {
 _criteraType = CriteriaType;
 _CriteriaName = Name;
 }
 [
 Category("Behavior"),
 DefaultValue(""),
 Description("List of Different types of parameters:" + 
 "PageURL, QuertString, Session, Cookie"),
 NotifyParentProperty(true),
 ]
 public CriteriaTypes ParameterType
 {
 get {
 return _criteraType;
 }
 set {
 _criteraType = value;
 }
 }
 [
 Category("Behavior"),
 DefaultValue(""),
 Description("ParameterName: exmaple: Name" + 
 "of the QueryString, Session,Coookie"),
 NotifyParentProperty(true)
 ]
 publicstring ParameterName
 {
 get {
 return _CriteriaName;
 }
 set {
 _CriteriaName = value;
 }
 }
 }
}

然后,在我的主要类" BannerRotator"中,我实现了" INamingContainer"接口:

//[DefaultProperty("Text")][ParseChildren(true, "BannerDisplayCheckCollection")]
[PersistChildren(false)]
[ToolboxData("<{0}:BannerRotator runat="server">")]publicclass BannerRotator : WebControl, INamingContainer

接下来的public 属性将负责从用户收集属性信息:

[Category("Behavior"),
Description("The BannerDisplayCheck collection"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
PersistenceMode(PersistenceMode.InnerDefaultProperty),
DefaultValue(null), MergableProperty(false), Bindable(false)]public List<BannerDisplayCheck> BannerDisplayCheckCollection
{
 get {
 if (_BannerDisplayCheck == null)
 {
 _BannerDisplayCheck = new List<BannerDisplayCheck>();
 }
 return _BannerDisplayCheck;
 }
}

我在函数" GetBannerDisplaySqlConditions"中使用了 Collection。 这个函数将在函数" GetBannersWithinArea"中构建SQL语句的查找部分:

protectedstring GetBannerDisplaySqlConditions()
{
 string retVal = null;
 if (_BannerDisplayCheck.Count >0)
 {
 retVal += " and banner_id in (select banner_id" + 
 "from BMS_BANNER_DISPLAY_CRITERIAS where";
 foreach (BannerDisplayCheck bdc in _BannerDisplayCheck)
 {
 switch (bdc.ParameterType)
 {
 case BannerDisplayCheck.CriteriaTypes.QueryString:
 if (!string.IsNullOrEmpty(
 HttpContext.Current.Request[bdc.ParameterName]))
 {
 retVal += "(criteria_code='" + 
 bdc.ParameterType.ToString() + "'";
 retVal += " and criteria_value='" + 
 HttpContext.Current.Request[bdc.ParameterName] + 
 "') or";
 }
 break;
 case BannerDisplayCheck.CriteriaTypes.PageURL:
 retVal += "(criteria_code='" + 
 bdc.ParameterType.ToString() + "'";
 retVal += " and criteria_value='" + 
 HttpContext.Current.Request.RawUrl.Split('?')[0] + 
 "') or";
 break;
 case BannerDisplayCheck.CriteriaTypes.UserDefined:
 if (!string.IsNullOrEmpty(_UserDefinedParameterValue))
 {
 retVal += "(criteria_code='" + 
 bdc.ParameterType.ToString() + "'";
 retVal += " and criteria_value='" + 
 _UserDefinedParameterValue + "') or";
 }
 break;
 case BannerDisplayCheck.CriteriaTypes.Session:
 if (!string.IsNullOrEmpty(Convert.ToString(
 HttpContext.Current.Session[bdc.ParameterName])))
 {
 retVal += "(criteria_code='" + 
 bdc.ParameterType.ToString() + "'";
 retVal += " and criteria_value='" + 
 HttpContext.Current.Session[
 bdc.ParameterName].ToString() + 
 "') or";
 }
 break;
 case BannerDisplayCheck.CriteriaTypes.Cookie:
 HttpCookie cookies = 
 HttpContext.Current.Request.Cookies[bdc.ParameterName];
 if (cookies!= null)
 {
 if (!string.IsNullOrEmpty(Convert.ToString(
 HttpContext.Current.Request.Cookies[bdc.ParameterName].Value)))
 {
 retVal += "(criteria_code='" + 
 bdc.ParameterType.ToString() + "'";
 retVal += " and criteria_value='" + 
 HttpContext.Current.Request.Cookies[
 bdc.ParameterName].Value.ToString() + 
 "') or";
 }
 }
 break;
 default:
 break;
 }
 }
 //removing the last un-needed or retVal = retVal.Substring(0, retVal.Length - 3);
 retVal += ")";
 }#if (debug) HttpContext.Current.Response.Write(retVal);
 // HttpContext.Current.Response.End();#endifreturn retVal;
}

结束语

有关源代码的详细信息,请从本文的顶部下载源代码。 源代码简单且注释良好。 下载演示以查看使用控件的不同场景。

希望这个控制是有用的,我想看看评论和投票。


相关文章