RSS是Really Simple Syndication的简称,它是一种网页内容联合格式(Web Content Sydication Format)。本章将介绍使用ASP.NET 2.0和ASP.NET AJAX技术,以及SQL Server 2005数据库共同实现AJAX RSS阅读器的方法。本章介绍的AJAX RSS阅读器是一种无刷新的阅读器,用户使用该阅读器可以以无刷新的方式动态折叠或展开阅读面板。AJAX RSS阅读器的一种效果图如图11.1所示。

图11.1 AJAX RSS阅读器
11.1 AJAX RSS阅读器构成
本节介绍AJAX RSS阅读器的AjaxRss应用程序的组成、配置、数据库设计等。
11.1.1 AjaxRss应用程序的组成
AJAX RSS阅读器应用程序的名称为AjaxRss,它使用的数据库的名称为AjaxRssDB。在Visual Studio 2005的【解决方案资源管理器】面板中查看该应用程序,如图11.2所示。AjaxRss应用程序的组成元素说明如下:
App_Code文件夹包含了2个类文件:ASPNETAJAXWeb.cs和Rss.cs,它们分别定义了AjaxRssSystem和Rss类。
App_Themes文件夹包含了AjaxRss应用程序的主题和样式文件,如web.css、web.skin等。
Bin文件夹包含了AjaxRss应用程序引入的程序集,如AjaxControlToolKit.dll、ASPNETAJAXWeb.ValidateCode.dll等。
AddUrl.aspx页面提供订阅RSS源的功能。
Default.aspx页面为AJAX RSS阅读器的主页面。
ReaderRss.aspx页面为AJAX RSS阅读器的一个辅助页面,它显示RSS源的具体内容。
UpdateUrl.aspx页面提供修改RSS源的功能。
UrlManage.aspx页面提供管理RSS源的功能。
ValidateCode.aspx页面提供产生验证码的功能。
Web.config文件为AjaxRss应用程序的配置文件,它配置了数据库连接字符串、引用的程序集等属性。

图11.2 在【解决方案资源管理器】面板中查看AjaxRss应用程序
11.1.2 AjaxRss应用程序的配置
AjaxRss应用程序的连接字符串放置在Web.config配置文件的<connectionString>元素中,具体代码如下:
<connectionStrings>
<add name="SQLCONNECTIONSTRING"
connectionString="data source=localhost;user id=sa;pwd=123456;
database=AjaxRssDB"
providerName="System.Data.SqlClient"/>
</connectionStrings>
AjaxRss应用程序在Web.config配置文件的<controls>元素中还配置了与AJAX服务器控件相关的内容,该内容为AjaxControlToolkit.dll程序集中的控件提供了一个前缀字符串“ajaxToolkit”。因此,在该应用程序中的页面引用AjaxControlToolkit.dll程序集中的控件时,不再需要在每一个页面的HTML代码中添加“<Register>”代码,而是直接使用“ajaxToolkit”前缀来引用AjaxControlToolkit.dll程序集中的控件。<controls>元素的具体代码如下:
<controls>
<add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit"
tagPrefix="ajaxToolkit"/>
……
</controls>
11.1.3 数据库设计
AJAX RSS阅读器的数据库的名称为AjaxRssDB,它只包含1个表:Rss,该表保存RSS源的信息,如源标识、源地址等。Rss表包含的字段及其说明如表11.1所示。
表11.1 Rss表
|
字 段 名 |
数据类型 |
字段说明 |
键 引 用 |
备 注 |
|
ID |
int |
ID |
PK |
主键(自动增一) |
|
Title |
varchar(50) |
源标识 |
|
|
|
Url |
varchar(255) |
源地址 |
|
|
|
CreateDate |
datetime |
创建时间 |
|
|
11.2 RSS源
本节介绍对RSS源的操作,如创建新的RSS源、修改RSS源的属性、删除RSS源、以列表显示RSS源等。
11.2.1 数据访问层设计
AJAX RSS阅读器的数据访问层由Rss类实现,该类包含在ASPNETAJAXWeb.AjaxRss命名空间中。Rss类的代码定义在Rss.cs类文件中,并且还引入了System.Data.SqlClient命名空间。下面的程序代码声明了Rss类。其中,该类中的方法代码已经省略。
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
namespace ASPNETAJAXWeb.AjaxRss
{
public class Rss
{
public Rss(){}
……
}
}
与RSS源相关的数据访问层共实现5个功能。实现这些功能及其方法的具体描述如下:
public DataSet GetRsses(),获取所有RSS源。
public SqlDataReader GetSingleRss(int rssID),获取指定的单个RSS源。
public int AddRss(string name,string url),添加RSS源到数据库中。
public int UpdateRss(int rssID,string name,string url),修改RSS源的信息。
public int DeleteRss(int rssID),删除RSS源。
其中,rssID参数指定被操作RSS源的ID值,name参数指定RSS源的标识,url参数指定RSS源的地址。
在下述程序代码中,GetRsses()方法获取所有RSS源。该方法的具体实现步骤如下:
从Web.config配置文件中获取数据库连接字符串,并保存在变量connectionString中。
使用上述连接字符串创建SqlConnection对象con,该对象用来连接数据库。
创建获取所有RSS源的SQL语句“SELECT * FROM Rss”。
创建获取数据的SqlDataAdapter对象da。
打开数据库连接,并获取数据。获取的结果保存在DataSet对象ds中。
如果上述操作成功,则返回ds。
public DataSet GetRsses()
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[
"SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///创建SQL语句
string cmdText = "SELECT * FROM Rss";
///创建SqlDataAdapter
SqlDataAdapter da = new SqlDataAdapter(cmdText,con);
///定义DataSet
DataSet ds = new DataSet();
try
{ ///打开连接
con.Open();
///填充数据
da.Fill(ds,"DataTable");
}
catch(Exception ex){throw new Exception(ex.Message,ex);} ///抛出异常
finally{con.Close();} ///关闭连接
return ds;
}
在下述程序代码中,GetSingleRss(int rssID)方法获取指定RSS源的信息。该方法的具体实现步骤如下:
从Web.config配置文件中获取数据库连接字符串,并保存在变量connectionString中。
使用上述连接字符串创建SqlConnection对象con,该对象用来连接数据库。
创建获取指定RSS源的SQL语句“SELECT * FROM Rss WHERE
ID=@ID”。其中,@ID参数的值由rssID参数指定。
创建获取数据的SqlCommand对象cmd。
打开数据库连接,并获取数据。获取的结果保存在SqlDataReader对象dr中。
如果上述操作成功,则返回dr。
public SqlDataReader GetSingleRss(int rssID)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[
"SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///创建SQL语句
string cmdText = "SELECT * FROM Rss WHERE ID=@ID";
///创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
///创建参数并赋值
cmd.Parameters.Add("@ID",SqlDbType.Int,4);
cmd.Parameters[0].Value = rssID;
///定义SqlDataReader
SqlDataReader dr;
try
{ ///打开连接
con.Open();
///读取数据
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(Exception ex){throw new Exception(ex.Message,ex);} ///抛出异常
return dr;
}
在下述程序代码中,AddRss(string name,string url)方法将RSS源的信息添加到数据库中。该方法的具体实现步骤如下:
从Web.config配置文件中获取数据库连接字符串,并保存在变量connectionString中。
使用上述连接字符串创建SqlConnection对象con,该对象用来连接数据库。
创建插入RSS源的SQL语句“INSERT INTO
Rss(Name,Url,CreateDate) VALUES (@Name,@Url,GETDATE())”。其中,@Name和@Url参数的值分别由name和url参数指定。
创建执行插入操作的SqlCommand对象cmd。
打开数据库连接,执行插入操作,并将该操作影响的行数保存在result变量中。
如果上述操作成功,则返回result变量的值,否则返回-1。
public int AddRss(string name,string url)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[
"SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///创建SQL语句
string cmdText = "INSERT INTO Rss(Name,Url,CreateDate)
VALUES(@Name,@Url,GETDATE())";
///创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
///创建参数并赋值
cmd.Parameters.Add("@Name",SqlDbType.VarChar,50);
cmd.Parameters.Add("@Url",SqlDbType.VarChar,255);
cmd.Parameters[0].Value = name;
cmd.Parameters[1].Value = url;
int result = -1;
try
{ ///打开连接
con.Open();
///操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex){throw new Exception(ex.Message,ex);} ///抛出异常
finally{con.Close();} ///关闭连接
return result;
}
在下述程序代码中,UpdateRss(int rssID,string name,string url)方法修改指定RSS源的信息。该方法的具体实现步骤如下:
从Web.config配置文件中获取数据库连接字符串,并保存在变量connectionString中。
使用上述连接字符串创建SqlConnection对象con,该对象用来连接数据库。
创建修改指定RSS源的SQL语句“UPDATE Rss SET Name=@Name,Url=@Url WHERE ID=@ID”。其中,@Name、@Url和@ID参数的值分别由name、url和rssID参数指定。
创建执行修改操作的SqlCommand对象cmd。
打开数据库连接,执行修改操作,并将该操作影响的行数保存在result变量中。
如果上述操作成功,则返回result变量的值,否则返回-1。
public int UpdateRss(int rssID,string name,string url)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[
"SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///创建SQL语句
string cmdText = "UPDATE Rss SET Name=@Name,Url=@Url WHERE ID=@ID";
///创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
///创建参数并赋值
cmd.Parameters.Add("@Name",SqlDbType.VarChar,50);
cmd.Parameters.Add("@Url",SqlDbType.VarChar,255);
cmd.Parameters.Add("@ID",SqlDbType.Int,4);
cmd.Parameters[0].Value = name;
cmd.Parameters[1].Value = url;
cmd.Parameters[2].Value = rssID;
int result = -1;
try
{ ///打开连接
con.Open();
///操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex){throw new Exception(ex.Message,ex);} ///抛出异常
finally{con.Close();} ///关闭连接
return result;
}
在下述程序代码中,DeleteRss(int rssID)方法将删除指定RSS源的信息。该方法的具体实现步骤如下:
从Web.config配置文件中获取数据库连接字符串,并保存在变量connectionString中。
使用上述连接字符串创建SqlConnection对象con,该对象用来连接数据库。
创建删除指定RSS源的SQL语句“DELETE Rss WHERE ID = @ID”。其中,@ID参数的值由rssID参数指定。
创建执行删除操作的SqlCommand对象cmd。
打开数据库连接,执行删除操作,并将该操作影响的行数保存在result变量中。
如果上述操作成功,则返回result变量的值,否则返回-1。
public int DeleteRss(int rssID)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[
"SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///创建SQL语句
string cmdText = "DELETE Rss WHERE ID = @ID";
///创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
///创建参数并赋值
cmd.Parameters.Add("@ID",SqlDbType.Int,4);
cmd.Parameters[0].Value = rssID;
int result = -1;
try
{ ///打开连接
con.Open();
///操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex){throw new Exception(ex.Message,ex);} ///抛出异常
finally{con.Close();} ///关闭连接
return result;
}
11.2.2 订阅RSS源
订阅RSS源由AddUrl.aspx页面实现,AddUrl.aspx.cs文件为它的代码隐藏文件。该页面提供了输入RSS源的标识和地址,以及将新的RSS源提交到数据库中的功能。AddUrl.aspx页面的效果图如图11.3所示。

图11.3 AddUrl.aspx页面的效果图
1.界面设计
AddUrl.aspx页面添加了2个TextBox控件和1个Button控件,它们的ID属性的值分别为tbName、tbUrl和btnCommit。
下述程序代码声明了1个TextBox控件,用来输入RSS源的标识,其ID属性的值为tbName。该控件使用了1个TextBoxWatermarkExtender控件和3个ValidatorCalloutExtender控件,它们的ID属性的值分别为wmeName、vceNameBlank、vceNameValue和vceNameRegex。其中,wmeName控件为tbName控件显示水印值“请输入标识”;vceNameBlank、vceNameValue和vceNameRegex控件分别以提示样式显示验证结果。
另外,tbName控件使用2个RequiredFieldValidator控件和1个RegularExpressionValidator控件,它们的ID属性的值分别为rfNameBlank、rfNameValue和revName。其中,rfNameBlank控件验证tbName控件的内容不能为空,即用户输入RSS源的标识不能为空。rfNameValue控件验证tbName控件的内容不能等于“请输入标识”(wmeName水印控件的水印值),这样可以防止用户不输入任何内容就提交到数据库。revName控件验证tbName控件内容的最小长度为1、最大长度为50。
地址标识:<asp:TextBox ID="tbName" runat="server" SkinID="tbSkin"
Width="60%" MaxLength="50"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfNameBlank" runat="server"
ControlToValidate="tbName" Display="none"
ErrorMessage="标识不能为空!"></asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="rfNameValue" runat="server"
ControlToValidate="tbName" Display="none" InitialValue="请输入标识"
ErrorMessage="标识不能为空!"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="revName" runat="server"
ControlToValidate="tbName" Display="none"
ErrorMessage="标识的长度最大为50,请重新输入。"
ValidationExpression=".{1,50}"></asp:RegularExpressionValidator>
<ajaxToolkit:TextBoxWatermarkExtender ID="wmeName" runat="server"
TargetControlID="tbName" WatermarkText="请输入标识"
WatermarkCssClass="Watermark">
</ajaxToolkit:TextBoxWatermarkExtender>
<ajaxToolkit:ValidatorCalloutExtender ID="vceNameBlank" runat="server"
TargetControlID="rfNameBlank" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
<ajaxToolkit:ValidatorCalloutExtender ID="vceNameValue" runat="server"
TargetControlID="rfNameValue" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
<ajaxToolkit:ValidatorCalloutExtender ID="vceNameRegex" runat="server"
TargetControlID="revName" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
下述程序代码声明了1个TextBox控件,用来输入RSS源的地址,其ID属性的值为tbUrl。该控件使用了1个TextBoxWatermarkExtender控件和3个ValidatorCalloutExtender控件,它们的ID属性的值分别为tweUrl、vceUrlBlank、vceUrlValue和vceUrlRegex。其中,tweUrl控件为tbUrl控件显示水印值“请输入地址”;vceUrlBlank、vceUrlValue和vceUrlRegex控件分别以提示样式显示验证结果。
另外,tbUrl控件使用2个RequiredFieldValidator控件和1个RegularExpressionValidator控件,它们的ID属性的值分别为rfUrlBlank、rfUrlValue和revUrl。其中,rfUrlBlank控件验证tbUrl控件的内容不能为空;rfUrlValue控件验证tbUrl控件的内容不能等于“请输入地址”(tweUrl水印控件的水印值),这样可以防止用户不输入任何内容就提交新的RSS源地址到数据库;revUrl控件验证tbUrl控件内容是否为合法的URL。
链接地址:<asp:TextBox ID="tbUrl" runat="server" SkinID="tbSkin" Width="60%"
MaxLength="50"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfUrlBlank" runat="server"
ControlToValidate="tbUrl" Display="none"
ErrorMessage="地址不能为空!"></asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="rfUrlValue" runat="server"
ControlToValidate="tbUrl" Display="none" InitialValue="请输入地址"
ErrorMessage="地址不能为空!"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="revUrl" runat="server"
ControlToValidate="tbUrl" Display="none"
ErrorMessage="链接地址的格式不正确,请重新输入。"
ValidationExpression="http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?">
</asp:RegularExpressionValidator>
<ajaxToolkit:TextBoxWatermarkExtender ID="tweUrl" runat="server"
TargetControlID="tbUrl" WatermarkText="请输入地址"
WatermarkCssClass="Watermark">
</ajaxToolkit:TextBoxWatermarkExtender>
<ajaxToolkit:ValidatorCalloutExtender ID="vceUrlBlank" runat="server"
TargetControlID="rfUrlBlank" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
<ajaxToolkit:ValidatorCalloutExtender ID="vceUrlValue" runat="server"
TargetControlID="rfUrlValue" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
<ajaxToolkit:ValidatorCalloutExtender ID="vceUrlRegex" runat="server"
TargetControlID="revUrl" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
下述程序代码声明了1个Button控件,其ID属性的值分别为btnCommit。btnCommit控件可以将用户输入的RSS源提交到数据库中。
<asp:UpdatePanel ID="upbutton" runat="server"><ContentTemplate>
<asp:Button ID="btnCommit" runat="server" Text="提交" SkinID="btnSkin"
Width="100px" OnClick="btnCommit_Click" />
</ContentTemplate></asp:UpdatePanel>
下述程序代码声明了AddUrl.aspx页面所必需的“@Page”指令和ScriptManager控件等内容。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AddUrl.aspx.cs"
Inherits="AddUrl" StylesheetTheme="ASPNETAjaxWeb" %>
<head id="Head1" runat="server"><title>收藏RSS地址</title></head>
<asp:ScriptManager ID="sm" runat="server"></asp:ScriptManager>
综上所述,AddUrl.aspx页面的设计界面如图11.4所示。

图11.4 AddUrl.aspx页面的设计界面
2.事件设计
用户单击AddUrl.aspx页面中的【提交】按钮(btnCommit控件)时,将触发btnCommit控件的Click事件:btnCommit_Click(object sender,EventArgs e)。
在下述程序代码中,btnCommit_Click(object sender,EventArgs e)事件实现了将用户输入的RSS源提交到数据库的功能。该事件调用Rss类中的AddRss(string name, string url)方法将新的RSS源提交到数据库。若上述操作成功,则重定向到RSS源管理页面UrlManage.aspx。
protected void btnCommit_Click(object sender,EventArgs e)
{ ///添加新的链接地址
Rss rss = new Rss();
if(rss.AddRss(tbName.Text,tbUrl.Text) > 0)
{ ///重定向到管理页面
Response.Redirect("~/UrlManage.aspx");
}
}
11.2.3 修改RSS源
修改RSS源由UpdateUrl.aspx页面实现,UpdateUrl.aspx.cs文件为它的代码隐藏文件。该页面提供了修改RSS源的标识和地址,以及将修改后的RSS源提交到数据库中的功能。UpdateUrl.aspx页面的效果图如图11.5所示。

图11.5 UpdateUrl.aspx页面的效果图
1.界面设计
UpdateUrl.aspx页面添加了2个TextBox控件和1个Button控件,它们的ID属性的值分别为tbName、tbUrl和btnCommit。由于该页面的设计界面和UpdateUrl.aspx页面的设计界面非常相似,因此,在此不做详细介绍。
下述程序代码声明了UpdateUrl.aspx页面所必需的“@Page”指令和ScriptManager控件等内容。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="UpdateUrl.aspx.cs"
Inherits="UpdateUrl" StylesheetTheme="ASPNETAjaxWeb" %>
<head id="Head1" runat="server"><title>修改RSS地址</title></head>
<asp:ScriptManager ID="sm" runat="server"></asp:ScriptManager>
综上所述,UpdateUrl.aspx页面的设计界面如图11.6所示。
2.初始化
UpdateUrl.aspx.cs文件首先引入了2个新的命名空间:System.Data.SqlClient和ASPNETAJAXWeb. AjaxRss,然后定义了1个变量:urlID。其中,urlID变量用来保存被修改RSS源的ID值,它的值从UpdateUrl.aspx页面的地址栏中获取。实现上述功能的程序代码如下:
///引入新的命名空间
using ASPNETAJAXWeb.AjaxRss;
using System.Data.SqlClient;
int urlID = -1;
UpdateUrl.aspx页面的初始化功能由其Page_Load(object sender, EventArgs e)事件实现。在下述程序代码中,该事件首先设置urlID变量的值,然后调用BindPageData(int urlID)函数读取并显示被修改RSS源的属性:标识和地址。其中,读取数据由Rss类的GetSingleRss(int rssID)方法(返回SqlDataReader类型的对象)实现。

图11.6 UpdateUrl.aspx页面的设计界面
另外,Page_Load(object sender, EventArgs e)事件还根据urlID变量的值设置btnCommit控件的可用性。如果urlID变量的值大于0,则该控件可用,否则不可用。
protected void Page_Load(object sender,EventArgs e)
{ ///获取被修改数据的ID
if(Request.Params["UrlID"] != null)
{
urlID = Int32.Parse(Request.Params["UrlID"].ToString());
}
///显示被修改的数据
if(!Page.IsPostBack && urlID > 0){BindPageData(urlID);}
///设置按钮是否可用
btnCommit.Enabled = urlID > 0 ? true : false;
}
private void BindPageData(int urlID)
{ ///读取数据
Rss rss = new Rss();
SqlDataReader dr = rss.GetSingleRss(urlID);
if(dr == null) return;
if(dr.Read())
{ ///显示数据
tbName.Text = dr["Name"].ToString();
tbUrl.Text = dr["Url"].ToString();
}
dr.Close();
}
3.事件设计
用户单击UpdateUrl.aspx页面中的【提交】按钮(btnCommit控件)时,将触发btnCommit控件的Click事件:btnCommit_Click(object sender,EventArgs e)。
在下述程序代码中,btnCommit_Click(object sender,EventArgs e)事件实现了将用户修改后的RSS源提交到数据库的功能。该事件调用Rss类中的UpdateRss(int rssID,string name, string url)方法将用户修改后的RSS源提交到数据库。若上述操作成功,则重定向到RSS源管理页面UrlManage.aspx。
protected void btnCommit_Click(object sender,EventArgs e)
{
Rss rss = new Rss();
///修改RSS地址的属性
if(rss.UpdateRss(urlID,tbName.Text,tbUrl.Text) > 0)
{ ///重定向到管理页面
Response.Redirect("~/UrlManage.aspx");
}
}
11.2.4 管理RSS源
管理RSS源由UrlManage.aspx页面实现,UrlManage.aspx.cs文件为它的代码隐藏文件。该页面提供了以列表形式显示RSS源、重定向到修改RSS源和创建新RSS源的链接,以及删除RSS源的功能。UrlManage.aspx页面的效果图如图11.7所示。

图11.7 UrlManage.aspx页面的效果图
1.界面设计
UrlManage.aspx页面添加了1个GridView控件和1个Button控件,它们的ID属性的值分别为gvCategory和btnAdd。
在下述程序代码中,gvUrl控件以列表形式显示RSS源。其中,第1列显示RSS源的名称,并且单击该名称可以查看该源的具体内容;第2列显示操作(修改和删除)RSS源的图片按钮。
<asp:UpdatePanel runat="server" ID="up"><ContentTemplate>
<asp:GridView ID="gvUrl" runat="server" Width="100%"
AutoGenerateColumns="False" SkinID="gvSkin"
OnRowCommand="gvUrl_RowCommand" OnRowDataBound="gvUrl_RowDataBound"
AllowPaging="True" OnPageIndexChanging="gvUrl_PageIndexChanging">
<Columns>
<asp:TemplateField HeaderText="地址标识"><ItemTemplate>
<a href='<%# Eval("Url") %>'><%# Eval("Name") %></a>
</ItemTemplate></asp:TemplateField>
<asp:TemplateField HeaderText="链接地址"><ItemTemplate>
<%# Eval("Url") %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="操作"><ItemTemplate>
<asp:ImageButton ID="imgUpdate" runat="server"
CommandArgument='<%# Eval("ID") %>'
ImageUrl="~/App_Themes/ASPNETAjaxWeb/Images/edit.PNG"
CommandName="update" />
<asp:ImageButton ID="imgDelete" runat="server"
CommandArgument='<%# Eval("ID") %>'
ImageUrl="~/App_Themes/ASPNETAjaxWeb/Images/delete.PNG"
CommandName="del" />
</ItemTemplate></asp:TemplateField>
</Columns>
<PagerSettings Mode="NextPreviousFirstLast" />
</asp:GridView>
</ContentTemplate></asp:UpdatePanel>
下述程序代码声明了1个Button控件,其ID属性的值为btnAdd。单击此控件可以重定向到创建新的RSS源的页面AddUrl.aspx。
<asp:Button ID="btnAdd" runat="server" Text="添加新的RSS地址"
OnClick="btnAdd_Click" SkinID="btnSkin" />
下述程序代码声明了UrlManage.aspx页面所必需的“@Page”指令和ScriptManager控件等内容。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="UrlManage.aspx.cs"
Inherits="UrlManage" StylesheetTheme="ASPNETAjaxWeb" %>
<head id="Head1" runat="server"><title>RSS地址管理</title></head>
<asp:ScriptManager ID="sm" runat="server" ></asp:ScriptManager>
综上所述,UrlManage.aspx页面的设计界面如图11.8所示。

图11.8 UrlManage.aspx页面的设计界面
2.初始化
UrlManage.aspx.cs文件引入了ASPNETAJAXWeb.AjaxRss命名空间。实现上述功能的程序代码如下:
///引入新的命名空间
using ASPNETAJAXWeb.AjaxRss;
UrlManage.aspx页面的初始化功能由其Page_Load(object sender, EventArgs e)事件实现。在下述程序代码中,该事件调用BindPageData()函数读取并显示RSS源的信息:标识和地址。其中,读取数据由Rss类的GetRsses()方法(返回DataSet类型的对象)实现。
protected void Page_Load(object sender,EventArgs e)
{
if(!Page.IsPostBack){BindPageData();}
}
private void BindPageData()
{ ///获取数据
Rss rss = new Rss();
DataSet ds = rss.GetRsses();
///显示数据
gvUrl.DataSource = ds;
gvUrl.DataBind();
}
3.事件设计
gvUrl控件定义了RowDataBound事件——gvUrl_RowDataBound(object sender, GridViewRow EventArgs e)。在下述程序代码中,该事件在gvUrl控件的每一行数据绑定之后触发,它为每一行中的删除按钮(imgDelete控件)添加了一个删除确认对话框。
protected void gvUrl_RowDataBound(object sender,GridViewRowEventArgs e)
{ ///添加删除确认对话框
ImageButton imgDelete = (ImageButton)e.Row.FindControl("imgDelete");
if(imgDelete != null)
{
imgDelete.Attributes.Add("onclick",
"return confirm(\"您确认要删除当前行的RSS地址吗?\");");
}
}
gvUrl控件定义了RowCommand事件——gvUrl_RowCommand(object sender, GridViewRow EventArgs e)。在下述程序代码中,该事件在用户单击gvUrl控件的每一行中的按钮之后触发。如果被单击按钮的CommandName属性的值为“update”,则重定向到修改RSS源的页面UpdateUrl.aspx,并将被修改RSS源的ID值传递到该页面;如果被单击按钮的CommandName属性的值为“del”,则调用Rss类的DeleteUrl(int urlID)方法删除当前行的RSS源,并重新显示RSS源信息。
protected void gvUrl_RowCommand(object sender,GridViewCommandEventArgs e)
{
if(e.CommandName.ToLower() == "update")
{ ///重定向到修改RSS地址页面
Response.Redirect("~/UpdateUrl.aspx?UrlID="
+ e.CommandArgument.ToString());
return;
}
if(e.CommandName.ToLower() == "del")
{ ///删除选择的RSS地址
Rss rss = new Rss();
if(rss.DeleteRss(Int32.Parse(e.CommandArgument.ToString())) > 0)
{
BindPageData();
}
return;
}
}
用户单击UrlManage.aspx页面中的【添加新的RSS地址】按钮(btnAdd控件)时,将触发btnAdd控件的Click事件:btnAdd_Click(object sender,EventArgs e)。
在下述程序代码中,btnAdd_Click(object sender,EventArgs e)事件实现了重定向到创建新的RSS源的页面AddUrl.aspx功能。
protected void btnAdd_Click(object sender,EventArgs e)
{
Response.Redirect("~/AddUrl.aspx");
}
4.分页设计
gvUrl控件启用了分页功能,并设置分页模式为NextPreviousFirstLast,同时还定义了分页事件:gvUrl_PageIndexChanging(object sender,GridViewPageEventArgs e)。在下述程序代码中,该事件首先设置gvUrl控件的新页码,然后重新绑定gvUrl控件的数据,并显示RSS源信息。
protected void gvUrl_PageIndexChanging(object sender,
GridViewPageEventArgs e)
{ ///设置新的页码,并重新显示数据
gvUrl.PageIndex = e.NewPageIndex;
BindPageData();
}
11.3 RSS阅读器
RSS阅读器提供了在线阅读RSS源的功能,如以分页的方式显示RSS源的内容、扩展和收缩阅读版面等。
11.3.1 RSS阅读面板
RSS阅读面板由Default.aspx页面实现,Default.aspx.cs文件为它的代码隐藏文件。该页面提供了自动扩展和收缩的面板显示RSS源的内容。Default.aspx页面的效果图如图11.9所示。
1.界面设计
Default.aspx页面添加了1个GridView控件,其ID属性的值为gvUrl。在下述程序代码中,gvUrl控件以列表形式显示RSS源的内容,且每一个显示RSS源的内容版面可以自动扩展和收缩。gvUrl控件只包含一个模板域(TemplateField),该域组成结构如图11.10所示。用户单击【RSS源的标识】区域可以扩展或者收缩(折叠)RSS源的内容版面。
图11.9 Default.aspx页面的效果图 图11.10 RSS源阅读器的阅读区域
RSS源的内容版面由一个Panel控件和一个iframe控件组成。iframe控件的src属性的值为“ReaderRss.aspx?RssUrl=<%# Eval("Url") %>”,它将显示ReaderRss.aspx页面的内容。
注意:RSS源的内容版面的自动扩展或者收缩功能将在11.3.2小节中介绍。
<asp:UpdatePanel runat="server" ID="up"><ContentTemplate>
<asp:GridView ID="gvUrl" runat="server" Width="100%"
AutoGenerateColumns="False" SkinID="gvSkin" AllowPaging="True"
OnPageIndexChanging="gvUrl_PageIndexChanging">
<Columns>
<asp:TemplateField HeaderText="AJAX RSS阅读器"><ItemTemplate>
<asp:Label ID="lbName" runat="server" Width="100%"
BackColor="#DAEEEE" CssClass="RssExpandCollapse"
Font-Bold="True" ForeColor="#0361D4" Font-Names="Tahoma"
BorderStyle="Solid" BorderWidth="1px">
<a href='ReaderRss.aspx?RssUrl=<%# Eval("Url") %>'><%#
Eval("Name") %></a></asp:Label><br />
<asp:Panel ID="pContent" runat="server">
<iframe frameborder="0" src='ReaderRss.aspx?RssUrl=<%#
Eval("Url") %>' width="100%" height="200"></iframe>
</asp:Panel>
<ajaxToolkit:CollapsiblePanelExtender ID="cpeRss"
runat="server" ExpandControlID="lbName"
CollapseControlID="lbName" AutoCollapse="true"
AutoExpand="true" ExpandDirection="Vertical"
ExpandedSize="200" ScrollContents="false"
TargetControlID="pContent"
TextLabelID="lbName">
</ajaxToolkit:CollapsiblePanelExtender>
</ItemTemplate></asp:TemplateField>
</Columns>
<PagerSettings Mode="NextPreviousFirstLast" />
</asp:GridView>
</ContentTemplate></asp:UpdatePanel>
下述程序代码声明了Default.aspx页面所必需的“@Page”指令和ScriptManager控件等内容。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" StylesheetTheme="ASPNETAjaxWeb" %>
<head runat="server"><title>AJAX RSS阅读器</title></head>
<asp:ScriptManager ID="sm" runat="server" ></asp:ScriptManager>
综上所述,Default.aspx页面的设计界面如图11.11所示。

图11.11 Default.aspx页面的设计界面
2.初始化
Default.aspx.cs文件首先引入了ASPNETAJAXWeb.AjaxRss命名空间。实现上述功能的程序代码如下:
///引入新的命名空间
using ASPNETAJAXWeb.AjaxRss;
Default.aspx页面的初始化功能由其Page_Load(object sender, EventArgs e)事件实现。在下述程序代码中,该事件调用BindPageData()函数读取并显示RSS源的信息。其中,读取数据由Rss类的GetRsses()方法(返回DataSet类型的对象)实现。
protected void Page_Load(object sender,EventArgs e)
{
if(!Page.IsPostBack){BindPageData();}
}
private void BindPageData()
{ ///获取数据
Rss rss = new Rss();
DataSet ds = rss.GetRsses();
///显示数据
gvUrl.DataSource = ds;
gvUrl.DataBind();
}
11.3.2 自动扩展和收缩阅读面板
RSS源的阅读面板的自动扩展和收缩功能由CollapsiblePanelExtender控件cpeRss实现。该控制指定扩展和收缩面板的ID值为pContent,扩展的方向为垂直方向(Vertical),扩展的最大高度为200。声明CollapsiblePanelExtender控件cpeRss的HTML代码如下:
<ajaxToolkit:CollapsiblePanelExtender ID="cpeRss"
runat="server" ExpandControlID="lbName"
CollapseControlID="lbName" AutoCollapse="true"
AutoExpand="true" ExpandDirection="Vertical"
ExpandedSize="200" ScrollContents="false"
TargetControlID="pContent"
TextLabelID="lbName">
</ajaxToolkit:CollapsiblePanelExtender>
当RSS源的阅读面板处于收缩时,效果如图11.12所示。用户单击RSS源的阅读面板中每一个RSS源的标识(如“sina1”、“sina23”等),就可以展开其阅读面板。

图11.12 RSS源的收缩(折叠)式的阅读面板
11.3.3 分页式阅读
Default.aspx页面还启用了gvUrl控件的分页功能,即用户能够以分页式方式阅读RSS源的内容。其中,gvUrl控件的分页模式设置为NextPreviousFirstLast,分页事件定义为gvCategory_ PageIndexChanging(object sender,GridViewPageEventArgs e)。在下述程序代码中,该事件首先设置gvUrl控件的新页码,然后重新绑定gvUrl控件的数据,并显示RSS源的内容。
protected void gvUrl_PageIndexChanging(object sender,
GridViewPageEventArgs e)
{ ///设置新的页码,并重新显示数据
gvUrl.PageIndex = e.NewPageIndex;
BindPageData();
}
11.3.4 显示RSS源的内容
显示RSS源的内容由ReaderRss.aspx页面实现,ReaderRss.aspx.cs文件为它的代码隐藏文件。该页面非常简单,它在Page_Load(object sender,EventArgs e)事件中获取RSS源的地址,并重定向到RSS源的地址指定页面。实现上述功能的程序代码如下:
string url = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{ ///重定向到RSS的网页
if(Request.Params["RssUrl"] != null)
{
url = Request.Params["RssUrl"].ToString();
Response.Redirect(url);
}
}





