65.9K
CodeProject 正在变化。 阅读更多。
Home

通过自定义控件添加 RSS Feed

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.09/5 (3投票s)

2006年11月10日

4分钟阅读

viewsIcon

70739

downloadIcon

476

本文介绍了一个用于显示 RSS Feed 返回内容的非常简单的自定义服务器控件的构建过程。

引言

本文介绍了一个用于显示 RSS Feed 返回内容的非常简单的自定义服务器控件的构建过程。该控件会调用一个公共 Web 服务来检索 RSS Feed 的当前数据,并显示内容以及用户定义的标签。公共 Web 服务返回的 Feed 内容是纯 HTML,这大大简化了显示数据的过程。

图 1:正在使用的 RSS Feed 自定义控件

入门

此项目包含的文件包括一个 Web 控件库项目和一个演示 Web 应用程序。要开始,请打开包含的 zip 文件并将这两个项目安装到您的文件系统中。打开 IIS 并为 Web 应用程序创建一个虚拟目录。将解决方案打开到 Visual Studio 2005 中,并进行任何必要的更改,将两个项目都集成到解决方案中。配置完成后,您的解决方案资源管理器应显示这些项目、引用和文件。

图 2:包含 Web 应用和控件库的解决方案资源管理器

在检查解决方案时,请注意 RSS 控件库仅包含一个控件,该控件名为“RssControl”。该项目还包含一个指向 http://www.webservicex.net/WS/WSDetails.aspx?WSID=54&CATID=12 的 Web 引用;这个公共站点提供了一个名为 RssToHtml 的 Web 服务 Web 方法;该方法通过其 GetHTML Web 方法检索 RSS Feed 内容并将其转换为 HTML。

Web 应用程序只包含一个 Web 页面(default.aspx),并包含对 RSS DLL 的引用。我还添加了一个用于天气预报的 DLL 到项目中,以便作为“眼药水”。

Web 应用程序作为用于测试自定义控件的容器。页面本身不包含其他代码;页面上有四个独立的 RSS 控件实例,以及一个天气预报控件实例。这些 RSS 控件都指向纽约时报提供的不同的 RSS Feed。

代码:RSS 控件

RSS 自定义控件的设计是在初始化时检索 Web 服务的信息;检索到的信息是指定 RSS Feed 的内容,该内容已由 Web 服务转换为 HTML。在初始化时,会检索 HTML,并在控件呈现时,添加一个标签控件并将其文本属性设置为显示 HTML。该控件公开两个重要的属性:一个是 RSS Feed 的 URL,另一个是 RSS 控件的标题。用户可以设置标题和 RSS Feed 属性。

在检查代码时,请注意项目中仅包含默认的导入。类本身继承自 WebControl 类。

Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls


<ToolboxData("<{0}:RssCC runat=server></{0}:RssCC>")> _
Public Class RssCC
    Inherits WebControl

在类声明之后,在声明区域内声明了四个成员变量;一个用于 Web 服务,三个字符串变量用于包含 RSS Feed、用户定义的 RSS Feed 标题以及一个用于 Web 服务返回的内容。

    #Region "Declarations"

         Private mNews As net.webservicex.www.RSStoHTML
         Private mMessage As String
         Private mRssUrl As String
         Private mRssTitle As String

    #End Region

接下来是方法区域,其中包含 RSS 控件的初始化事件处理程序。

#Region "Methods"

    Private Sub RssCC_Init(ByVal sender As Object, _
            ByVal e As System.EventArgs) _
            Handles Me.Init

        If Not RssFeed Is String.Empty Then
            mNews = New net.webservicex.www.RSStoHTML
            mMessage = mNews.GetHTML(RssFeed)
        End If

    End Sub

#End Region

初始化事件处理程序会检查 RssFeed 属性是否为空,如果不为空,它会调用 Web 服务的 GetHTML Web 方法,用服务返回信息的 HTML 版本填充消息成员变量。

项目中的下一个区域称为“Properties”,其中包含控件使用的两个属性:RssFeedRssFeedTitle。这些属性会更新或读取私有成员变量的内容以管理其内容。RssFeed 属性用于包含 RSS Feed 的路径,而 RssFeedTitle 属性允许用户输入控件的标题。

#Region "Properties"

    <Category("RSS Feed")> _
    <Browsable(True)> _
    <Description("Enter the URL for the RSS Feed.")> _
    Public Property RssFeed() As String
        Get
            Return mRssUrl
        End Get
        Set(ByVal value As String)
            mRssUrl = value
        End Set
    End Property


    <Category("RSS Feed")> _
    <Browsable(True)> _
    <Description("Enter the title for the RSS Feed.")> _
    Public Property RssFeedTitle() As String
        Get
            Return mRssTitle
        End Get
        Set(ByVal value As String)
            mRssTitle = value
        End Set
    End Property

#End Region

最后需要处理的是呈现;这里重写了 RenderContents,并在一个 TryCatch 块内,创建了一组嵌套的 Div。在主 Div 内有两个独立的 Div,一个用于存放用户定义的 Feed 标题,另一个用于显示 HTML。在这两种情况下,内容都是通过添加到 Div 的标签控件来呈现的。如果呈现操作失败,控件将向用户显示“RSS Feed 离线”。

#Region "Rendering"

    Protected Overrides Sub RenderContents(ByVal output As HtmlTextWriter)

        Try
            output.AddAttribute(HtmlTextWriterAttribute.Align, "center")
            output.AddAttribute(HtmlTextWriterAttribute.Valign, "top")
            output.AddAttribute(HtmlTextWriterAttribute.Width, "100%")
            output.RenderBeginTag(HtmlTextWriterTag.Div)

            output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
            output.AddAttribute(HtmlTextWriterAttribute.Valign, "top")
            output.AddAttribute(HtmlTextWriterAttribute.Width, "50%")
            output.RenderBeginTag(HtmlTextWriterTag.Div)
            Dim lbl As New Label
            lbl.ID = "lblRssTitle"
            lbl.Text = "<b>" & Me.RssFeedTitle.ToString() & "</b>"
            lbl.RenderControl(output)
            output.RenderEndTag()

            output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
            output.AddAttribute(HtmlTextWriterAttribute.Valign, "top")
            output.AddAttribute(HtmlTextWriterAttribute.Width, "50%")
            output.RenderBeginTag(HtmlTextWriterTag.Div)
            Dim lbl2 As New Label
            lbl2.ID = "lblRssContent"
            lbl2.Text = mMessage.ToString()
            lbl2.RenderControl(output)
            output.RenderEndTag()

            output.RenderEndTag()

        Catch

            output.RenderBeginTag(HtmlTextWriterTag.Div)
            output.Write("RSS Feed Offline")
            output.RenderEndTag()

        End Try

    End Sub

#End Region

摘要

本项目演示了一种非常简单的方法,通过使用自定义服务器控件和 Web 服务在网页上显示 RSS Feed 内容。该控件仅显示 RSS Feed 站点的当前或最新 Feed;要显示任何给定 RSS Feed 的多个 Feed 消息,则需要捕获和存储随时间推移的消息。可以使用相同的 Web 服务 Web 方法来实现此任务,方法是将消息捕获并保存到数据库中,这些包含 Feed 内容 HTML 版本的存储字符串可以以与本演示中使用的方式类似的方式填充标签。

© . All rights reserved.