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

ASP.NET 留言簿

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (49投票s)

2002年6月20日

2分钟阅读

viewsIcon

750252

downloadIcon

6966

一个从头开始编写的 ASP.NET 应用程序,用于展示留言簿。

Sample Image - Guestbook.gif

目录

引言

这是一个允许人们在网站上签署留言簿的项目。该项目分为两个部分:

  • 签署留言簿。
  • 查看留言簿。

数据库

留言簿将存储在服务器上的一个 XML 文件中,名为 guestbook.xml。XML 文件的编码已更改为 ISO-8859-1,以便能够处理特殊字符。以下是 XML 文件的结构:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<guestbook>
    <guest private="yes">
        <name>Laurent Kemp?t;/name>

您将被提示输入以下信息:

  • 名称
  • 电子邮件
  • 主页标题
  • 主页 URL
  • Location
  • 注释
  • 私密 - 我只希望网站所有者看到我的电子邮件

Application

为了能够自由地更改留言簿的显示方式,需要将编码与数据分离。为了实现此要求,我选择使用 XSLT 将 XML 文件转换为返回给客户端的 HTML 文件。

签名

允许人们签署留言簿的页面是名为 'Sign.aspx' 的 Web 窗体。此页面将要求用户填写一些文本框,其中包含要在留言簿上显示的信息。为了能够验证这些信息,我们使用 RequiredFieldValidator。我们还使用 RegularExpressionValidator 来验证电子邮件地址。

当访客填写完所有信息后,他会按下“继续”按钮,页面会在 ButtonContinue_Click 方法中获取该事件。该方法加载 XML 数据库,检索访客输入的信息,并将它们添加到 XML 文件的开头。然后,新的数据库将保存在服务器磁盘上,访客将被重定向到查看页面。

private void ButtonContinue_Click(object sender, System.EventArgs e)
{
    //Load guestbook database

    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load( Server.MapPath("guestbook.xml") );

    //Get private status

    string strPrivate;
    if ( CheckBoxPrivate.Checked )
        strPrivate = "yes";
    else
        strPrivate = "no";

    //Create a new element

    XmlElement elem = xmldoc.CreateElement("guest");
    elem.SetAttribute("private", strPrivate);

    //Add the new guest as the first node

    xmldoc.DocumentElement.PrependChild(elem);

    addTextElement( xmldoc, elem, "name", TextBoxName.Text );
    addTextElement( xmldoc, elem, "email", TextBoxEMail.Text );
    addTextElement( xmldoc, elem, "homepage", TextBoxHomepageTitle.Text );

    XmlAttribute newAttr = xmldoc.CreateAttribute("url");
    newAttr.Value = TextBoxHomepageURL.Text;

    elem.LastChild.Attributes.Append( newAttr );
    
    addTextElement( xmldoc, elem, "location", TextBoxLocation.Text );
    addTextElement( xmldoc, elem, "comment", TextBoxComments.Text );

    //Write date

    string strDate = DateTime.Now.ToLongDateString() + 
                     " - " + 
                     DateTime.Now.ToLongTimeString(); 

    addTextElement( xmldoc, elem, "date", strDate );

    xmldoc.Save( Server.MapPath("guestbook.xml") );

    Response.Redirect("view.aspx");
}

我们使用 addTextElement 方法将新的访客条目构建到数据库中

private void addTextElement( XmlDocument doc, XmlElement nodeParent, 
                             string strTag, string strValue )
{
    XmlElement nodeElem = doc.CreateElement( strTag );
    XmlText nodeText = doc.CreateTextNode( strValue );
    nodeParent.AppendChild( nodeElem );
    nodeElem.AppendChild( nodeText );
}

查看

为了查看所有留言簿条目,我们向项目中添加另一个名为 'View.aspx' 的 Web 窗体。在该页面的 Page_Load 方法中,我们加载 XML 数据库和 XSLT 文件。我们进行转换,并将结果输出到 Literal Web 窗体控件中。

private void Page_Load(object sender, System.EventArgs e)
{
    //Load guestbook database from the xml file

    XmlDocument doc = new XmlDocument( );
    doc.Load( Server.MapPath("guestbook.xml") );

    // Get the page number asked

    string strPageAsked = Request.QueryString["page"];

    // If the page is not defined then set it to first one

    if ( strPageAsked == null )
    {
        strPageAsked = "1";
    }

    int nGuestPerPage = 5;
    int nGuests = doc.ChildNodes[1].ChildNodes.Count;

    int nPageAsked = System.Convert.ToInt32(strPageAsked);

    int lowerbound = 1 + ( nPageAsked - 1 ) * nGuestPerPage;
    int upperbound = lowerbound + nGuestPerPage - 1;

    //Do XSLT transformation

    XslTransform xslt = new XslTransform();
    xslt.Load( Server.MapPath("guestbook.xslt") );

    //Build XLST Param list

    XsltArgumentList xsltArgs = new XsltArgumentList();
    xsltArgs.AddParam("lowerbound", "", lowerbound.ToString());
    xsltArgs.AddParam("upperbound", "", upperbound.ToString());

    //Transform XML to HTML

    MemoryStream ms = new MemoryStream();
    xslt.Transform( doc, xsltArgs, ms );
    ms.Seek( 0, SeekOrigin.Begin );

    StreamReader sr = new StreamReader(ms);

    //Insert result in the View.aspx page

    LiteralGuests.Text = sr.ReadToEnd();

    //Insert the pages navigator at the bottom of the page

    int nPages = 0;
    
    if (( nGuests % nGuestPerPage) != 0 )
        nPages = 1 + (nGuests / nGuestPerPage);
    else
        nPages = (nGuests / nGuestPerPage);

    LiteralGuests.Text += "Page(s) ";

    for (int n = 1; n <= nPages; n++)
    {
        LiteralGuests.Text += "<font face='verdana' size='2'>"
        LiteralGuests.Text += "<a href='/Guestbook/View.aspx?page=";
        LiteralGuests.Text += n.ToString();
        LiteralGuests.Text += "'>";
        LiteralGuests.Text += n.ToString();
        LiteralGuests.Text += "</a></font> ";
    }

    sr.Close();
}

从 XML 到 HTML 的所有转换都在 guestbook.xslt 文件中完成。此转换请求两个参数:lowerboundupperbound,分别表示要显示的留言簿页面的下限和上限索引值。基本上,我们所做的是从下限循环到上限并进行转换。

<xsl:for-each 
  select="//guest[position() <= $upperbound and position() >= $lowerbound]">
    <xsl:apply-templates select="name"/>
</xsl:for-each>

例如,如果电子邮件未定义为私密,则这是用于显示带有电子邮件的访客的转换。

<xsl:template match="name">
    <xsl:choose>
        <xsl:when test="../@private='yes'">
            <font face="verdana" size="2">
                <b><xsl:value-of select='.' /></b>
            </font>
        </xsl:when>
        <xsl:otherwise>
            <font face="verdana" size="2">
                <b><a HREF="mailto:{../email}"><xsl:value-of select='.' ></a></b>
            </font>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

您可以查看 guestbook.xslt 文件以获取更多详细信息。

结论

我想说的是,将数据与流程分离对您有所帮助,在这方面,XML 提供了很大的帮助。如果您想更改留言簿视图的外观,您只需要更改 guestbook.xslt 文件即可。

遇到的问题

  • 无。

历史

  • 1.00 版本 - 2002 年 5 月 30 日

    首次发布。

© . All rights reserved.