分享
 
 
 

生成 ContentRotator ASP.NET 服务器控件

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

摘要:

介绍创建自定义、编译的 ASP.NET 服务器控件涉及的步骤,这种控件对所有的特定内容进行随机滚动,就像内置的 AdRotator 控件随机滚动一系列预定义的标语广告一样。在介绍 ContentRotator 控件的核心内容时,本文涉及到自定义 ASP.NET 控件开发的几个方面。

简介

早在九十年代末期,似乎没有什么事情是不可能发生的。World Wide Web 及其对商业的影响急剧增加 — 孩子们退学建立 Web 站点而一夜暴富,企业也斥资数百万美元在黄金电视时段播放广告,吸引人们上网为宠物购买食物。没错,这就是新经济时代,相比于在令人乏味的建筑物中销售单调的旧产品而言,将数百万的 Web 网民吸引到 Web 站点来的确更有经济价值。

在这个浮华的时代,Microsoft 引入了 传统 ASP 的 AdRotator COM 组件,它使崭露头角的 Web 企业家能够将标语广告轻松添加到他们的站点中。显示标语广告的第一步是具有一个列出可以显示的标语的 advertisements 文件。该文本文件包含有关每个标语的四类信息:

• 指向该标语图像的 URL

• 该图像链接到的 URL

• 该图像的替换文本

• 该标语相对于文件中其他标语的显示频率

使用该文本文件时,ASP 开发人员必需调用 AdRotator 的 GetAdvertisement(advertisementFile) 方法,从而传入到 advertisements 文件的路径,而 AdRotator 将返回 HTML 标记,用于显示从指定文件随机选择的标语广告。我想,这时候已经财源滚滚了。

2002 年交付 ASP.NET 时,新经济时代已经成为过去。NASDAQ 指数在 2000 年曾经攀升至 5,000 点左右,而现在已跌到 2,000 点以下。尽管 .com 彻底垮台,但 Microsoft 依旧对在线广告持乐观态度,缘由是他们已修整了 传统 ASP 的 AdRotator 控件并进行了发布 — 作为一个标准 Web 控件与 ASP.NET 一起提供。AdRotator 的 ASP.NET 版本较之传统的 ASP 版本有以下几个优势:

• advertisements 文件现已是 XML 格式化的,从而使页面开发人员可以更轻松地创建和编辑该文件的内容。

• 每个广告可以包含一个指示其所属类别的关键字。除了 AdRotator 的新 KeywordFilter 属性之外,这可用来限制针对具体 AdRotator 控件实例显示的标语集。

• 除了标准的广告属性集之外,页面开发人员可以将他们自己的附加设置添加到 advertisements 文件中。然后,添加的这些设置可由页面开发人员通过 AdRotator 的 AdCreated 事件以编程方式访问。

虽然 AdRotator 能更容易地随机显示来自预定义列表的标语,但是它存在很多缺点,在我看来,其中有两个主要的缺点:

1.AdRotator 的内容只可以通过 XML 格式化的 advertisements 文件进行指定。这虽然不是一个主要限制,但是如果能够通过 AdRotator 的标记以声明方式指定内容,或者通过源代码以编程方式进行指定,则是比较理想的,这非常类似于针对 DropDownList Web 控件以声明方式或编程方式指定 ListItem。

2.AdRotator 在它可以生成的标记方面受到一些限制。顾名思义,它旨在显示广告,这些广告是文本或链接到某个 URL 的图像。只需进行少量工作,就可以将 AdRotator 创建为显示任何 类型的内容,而不仅仅是标语或文本广告。

第二个缺点特别让我感到烦恼,因为只需再进行少量工作就可以使 AdRotator 成为一个非常通用的内容滚动器,而不仅仅设计为只显示广告。在本文中,我们将通过创建一个全功能的 ContentRotator 服务器控件来克服该缺点以及其他缺点。

考虑内容滚动

在深入研究任何编码项目之前,重要的是用充足的时间回答以下三个问题。

1. 有满足我需要的现有控件吗?如果您的工作和我类似,就是说每天有很多会议和电子邮件,还要花费更多时间进行其他繁忙的工作,则编写代码通常是一天中最有趣的活动。如果对问题产生了兴趣并通过代码找到该问题的解决方案,那么没有什么比这让令人兴奋了。

但是,“有趣”与“具有经济价值”可完全是两码事。创建具体控件可能是有趣的,但如果已经存在能够提供所需功能的控件,那么花费时间生成、测试和调整此类控件就毫无经济意义可言。

当我想创建新的服务器控件时,我首先会进入 ASP.NET Control Gallery,看看我是不是在做无用功。快速查看 Control Gallery,显示用于 Content Rotators 的一个完整类别。但是,这些内容滚动器(例如,新闻或股票自动接收器)的大多数都在单个页面滚动所有的内容。

我发现有一个控件可以滚动完整的诸如 AdRotator 控件(Duncan Mackenzie 的ContentRotator 用户控件,详述于文章 Rotating Is Fun)的任意静态 HTML 内容。虽然 Duncan 的用户控件提供了 AdRotator 的基本功能且支持任意 HTML 内容,但我决定不使用他的解决方案,因为它并不提供我需要的功能。(例如,Duncan 的控件不允许为内容标记关键字。)

在搜索过程中,我没有找到满足需要的内容滚动器。因此我决定自己创建。(哈哈!老板,会议请先等一下吧,我现在要马上完成一个编程项目!)

2. 我的控件需要提供什么功能?如果您决定创建自己的控件,请不要立即深入到最有趣的部分 — 编码;相反,您需要在开始编码之前清楚地了解该控件需要具有哪些功能。确定控件要求的一个好方法是设计常规用例,这些用例描述最终用户(在本例中是页面开发人员)将如何使用您的控件。在生成服务器控件时,我首先要自问的几个问题是:

• 页面开发人员将如何使用该控件?

• 他们需要该控件做什么?

• 语法应该如何?

在经过一番深思熟虑之后,我设计了以下四个用例:

Harry(一个很有前途的 ASP.NET 开发人员)想增强其公司的 Intranet,以便主页可以随机显示一个公司雇员的简历和照片。由于 Harry 的公司只有十多个雇员,因此他目前喜欢在一个文件中硬编码简历和照片,但希望日后可以对其进行升级,以便随着公司的发展从数据库检索这些项。他的目标是让 ContentRotator 从该文件随机选择一个雇员,每次访问时在主页上显示有关该雇员的信息。

Jisun 是 BuyPetFoodOnline.com 的一位开发人员,这个网站是新启动的,关于它的风险投资能否取得回报都寄希望于 John Q 身上。大家对在线购买 Alpo 很感兴趣。BuyPetFoodOnline.com 上销售的所有宠物食物品牌都在一个 Microsoft SQL Server 数据库中维护。在该站点的主页上,Jisun 想显示最畅销的 10 种宠物食物品牌列表,或者各类狗食列表或猫食列表。此外,她希望每当狗食或猫食的内容组合时,最畅销的十个销售品牌内容平均显示两次。

Todd 运行一个有关健身的 Web 站点,目前已有数千名会员在该站点上注册,注册信息包括姓名、出生日期、体重以及其他和健康相关的数据。在每页的底部,Jim 想针对访问者的个人信息显示随机健康统计信息。例如,他想显示以下消息:[[username]]、您已经活了 [[numberOfDaysSinceBirth]] 天、您的平均脉搏是 [[averageHeartRateTimesDaysAlive]],其中每一个占位符均用特定于登录用户的值进行填充。

成长中的 ASP.NET 开发人员 Darren 是一个 XML 的新手,他很担心在 XML 格式化的内容文件中指定内容项时会犯错误。Darren 非常熟悉 DropDownList Web 控件,经常使用 DropDownList 的描述性语法指定 ListItem。Darren 也希望能够以相同的方式为 ContentRotator 指定内容项。同样,他将能够以编程方式操作 ContentRotator 的内容项,使用的语法类似于以编程方式使用 DropDownList 的 ListItem 所需的语法。

ContentRotator 的功能就是从这些用例中产生的,这些用例在 ContentRotator 的实现中提供指导。

3.有代码重用的可能性吗?面向对象编程的一大好处是,可以轻松合并和扩展现有功能。在创建新服务器控件时,很可能已经存在提供类似功能的 ASP.NET 服务器控件。只扩展该现有服务器控件而不重新生成服务器控件可能吗?在现有控件基础上进行构建将节省大量的编码和测试时间。

在开始创建用于 ContentRotator 的代码时,我实验了使 ContentRotator 扩展现有 ASP.NET AdRotator 控件的可能性。AdRotator 类包含了从广告文件读取项并随机选择一个适当项所需的方法和属性。我能够重用该类并重写发送标语或文本广告的特定方法,从而将其更改为返回更多一般内容的方法吗?

我考虑了该方法,但由于以下原因决定不使用它。首先,AdRotator 的许多方法都没有标记为 virtual,这意味着它们不能重写。特别是,由于解析 advertisements 文件的方法不是虚拟的,因此我的派生类将必须使用 AdRotator 的现有 XML 格式。这不一定会限制 ContentRotator 的功能(由于 AdRotator 可以添加任意 XML 元素),但它仍然会产生一些限制,因为它将使用 advertisement 文件的 和 元素。此外,AdRotator 需要一个 元素,它对于一般内容滚动器来说是一个无法接受的要求。

在经过谨慎考虑之后,我最终准备开始编写代码 — 这是一个有趣的环节。在下文中,我将介绍 ContentRotator 控件的一些更有趣的代码,这些代码不仅可以揭示该特定控件的内部工作,还提供一个示例,用于在创建的服务器控件中实现相似的功能。

指定内容项

ContentRotator 控件提供三种用于指定内容项的方式:

1. 通过 XML 格式的一个单独内容文件。

2.通过 ContentRotator 的声明性语法。

3. 通过服务器端编程方法。

第一个选项使用一个外部文件提供对内容项更好的重用,因为单个内容文件可以通过单个 Web 站点中不同页上的许多内容滚动器使用。但是,有时您可能想快速创建简单的 ContentRotator 控件,而不必烦恼于创建单独的内容文件。在这些情况下,您可以使用第二个选项,并提供内容项来迭代通过该控件的声明性语法。最后一个选项允许您以编程方式指定内容项。如果需要动态选择可能的内容项,或者这些内容项存在于一个数据库或其他某个非静态存储中,则该选项是有用的。

通过内容文件指定内容

当在 XML 格式化内容文件中指定内容项时,必须针对具体的 XML 架构提供内容项。特别是,内容文件必须以 元素开头,该元素包含每个内容项的 元素。每个 项有三个可选属性:

• impressions — 指定内容项的重要性,用来确定项显示的概率。

• keyword — 指定内容项的关键字。ContentRotator 控件包含一个 KeywordFilter 属性,如果设置该属性,则将所显示的内容项限制为具有匹配的关键字 参数的内容项。

• contentPath — 内容项可以包含静态 HTML 标记或代码驱动的动态内容。如果您想使用动态内容,可以通过该属性指定到 User Control 的路径。如果设置所选内容项的 contentPath 属性,则该内容通过指定的 User Control 生成。

元素也可以包含提供要显示的静态标记的文本。如果未提供 contentPath 属性,则显示该静态标记。

以下示例显示一个带有四个内容项的、正确进行格式化的内容文件。第一个内容项缺少任何可选属性,只由要显示的文本内容组成。第二个内容项提供 impressions 和 keyword 属性,而第三个内容项只设置 keyword 属性。请注意,如果您想在内容项的文本部分显示 HTML 标记,则需要像在第二个示例中一样转义 XML 标记,方法是使用 < 和 > 而不是 < 和 >,或者需要将整个内容包装在一个 部分中。第四个(最后一个)内容项引用一个 User Control (RichContent.ascx),该控件通过 contentPath 属性指定。此外,impressions 属性设置为 5。

<?xml version="1.0" encoding="utf-8" ?>

<contents>

<content>

Things are just average... neither positive nor negative...

</content>

<content impressions="3" keyword="positiveComments">

<b>You will soon see a workplace promotion.</b>

</content>

<content keyword="positiveComments">

<![CDATA[

Happiness is <i>just around the corner!</i>

]]>

</content>

<content contentPath="~/RichContent.ascx" impressions="5" />

</contents>

该内容文件需要保存在 Web 服务器的文件系统中。要显示特定文件的内容,只需将 ContentRotator 添加到 ASP.NET 页,并将它的 ContentFile 属性设置为内容文件的虚拟路径。

注要记住,XML 是区分大小写的,因此 XML 元素的大小写是重要的。如果您没有使用正确的大小写(例如,使用 而非 ),则不会从内容文件检索这些内容项,从而得到一个不发出任何内容项的 ContentRotator 控件。

声明性地指定内容项

许多 ASP.NET Web 内置控件允许其大多数属性用 Web 控件的声明性语法来指定。例如,您可以指定通过 声明性语法创建 DataGrid 的特定 DataGridColumn。ContentRotator 提供类似的声明性语法来指定它的内容项。对于 ContentRotator 要随机显示的每个项,请在 标记中添加一个 元素。每个 元素可以包含以下属性:

• Content

• Impressions

• Keyword

• ContentPath

这些属性分别映射到 元素的文本部分,以及 XML 内容文件架构的 impressions、keyword 和 contentPath 属性。(您可以选择将 Content 属性指定为该内部标记的文本内容,如下面的前两个 实例所示。)下面显示用于 ContentRotator 的声明性语法,其中带有前面使用的四个内容项。

<skm:ContentRotator id="ContentRotator1" runat="server">

<skm:ContentItem>Things are just average... neither positive nor

negative...</skm:ContentItem>

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有