zoukankan      html  css  js  c++  java
  • 适用于ASP.NET的留言本(翻译)

    留言本样图

    目录

    绪论

    这是一个允许web站点上的访问者在留言本上留言的项目。项目建立了两个部分:

    • 在留言本上留言。
    • 浏览留言本上的内容。

    数据库

    这个留言本使用的是放在服务器上的一个名叫 guestbook.xml 的文件来存储数据的。为了处理特殊字符,将 XML 文件的编码设置为 ISO-8859-1。 下面是 XML 文件的结构:

     <?xml version="1.0" encoding="ISO-8859-1" ?>
    <guestbook>
        
    <guest private="yes">
            
    <name>Laurent Kemp?t;/name>
            
    <homepage url="http://perso.wanadoo.fr/laurent.kempe/">Tech Head</homepage>
            
    <location>Illzach, France</location>
            
    <comment>First to sign the guestbook ;)</comment>
            
    <date>Thursday, May 30, 2002 - 10:29 AM</date>
        
    </guest>
    </guestbook>

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

    • Name (姓名)
    • E-Mail (电子邮件)
    • Homepage title (主页标题)
    • Homepage URL (主页网址)
    • Location (地点)
    • Comments (留言内容)
    • PRIVATE (私有) - 我只想让站长看到我的电子邮件地址

    应用(这里我将Application翻译成应用,不知道合不合适)

    为了更加方便地改变留言本的显示方式,有必要将编码和数据分离开来。为了这个目标,我使用 XSLT 来将 XML 文件转换成 HTML 文件,然后将之返回到客户端。

    留言

    允许访问者留言的 Web 窗体叫 'Sign.aspx'。这个页面要求留言者在文本框中填写一些内容,而这些内容将显示在留言本中。为了确保留言者一定要在文本框中输入内容,我们使用 RequiredFieldValidator 控件来验证数据的有效性。同样为了验证留言者输入了正确的电子邮箱地址,我们使用 RegularExpressionValidator 控件。

    当访问者填写了他留言的内容后,单击 Continue 按钮,页面将会触发按钮的Click事件,从而执行 ButtonContinue_Click 方法里的代码。该方法首先加载 XML 数据库,然后获取访问者留言的内容并将之添加到 XML 文件的开始部分。然后新的数据库就会被保存到服务器的磁盘上,同时将访问者重定向到显示页面。

    
    
    private void ButtonContinue_Click(object sender, System.EventArgs e)
    {
        
    //加载留言本数据库
        XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load( Server.MapPath(
    "guestbook.xml") );
        
    //获取数据的私有性
        string strPrivate;
        
    if ( CheckBoxPrivate.Checked )
            strPrivate 
    = "yes";
        
    else
            strPrivate 
    = "no";
        
    //创建一个新的元素
        XmlElement elem = xmldoc.CreateElement("guest");
        elem.SetAttribute(
    "private", strPrivate);
        
    //添加新的留言内容为第一个节点
        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 );
        
    //写入日期
        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 );
    }

    显示

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

    
    
    private void Page_Load(object sender, System.EventArgs e)
    {
        
    // 从 XML 文件中加载留言本数据
        XmlDocument doc = new XmlDocument( );
        doc.Load( Server.MapPath(
    "guestbook.xml") );
        
    // 获取需要的页面数
        string strPageAsked = Request.QueryString["page"];
        
    // 如果没有找到需要的页面数,那么设置它为1
        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;
        
    // 进行 XSLT 转换
        XslTransform xslt = new XslTransform();
        xslt.Load( Server.MapPath(
    "guestbook.xslt") );
        
    // 建立 XLST 参数列表
        XsltArgumentList xsltArgs = new XsltArgumentList();
        xsltArgs.AddParam(
    "lowerbound""", lowerbound.ToString());
        xsltArgs.AddParam(
    "upperbound""", upperbound.ToString());
        
    // 将 XML 转换为 HTML
        MemoryStream ms = new MemoryStream();
        xslt.Transform( doc, xsltArgs, ms );
        ms.Seek( 
    0, SeekOrigin.Begin );
        StreamReader sr 
    = new StreamReader(ms);
        
    // 将结果插入到 View.aspx 页面中
        LiteralGuests.Text = sr.ReadToEnd();
        
    // 在页面底部插入页面导航链接
        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 文件做的。这个转换需要两个参数: lowerbound and upperbound,它们定义了将要显示在页面上的数据的下限和上限值。基本上,我们所做的就是从下限到上限进行循环,然后转换数据:

    <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><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

      第一次发布。

    原文http://www.codeproject.com/aspnet/guestbooklk.asp,第一次翻译,还请大家批评指正

  • 相关阅读:
    java 异常练习题1
    java 异常练习题
    java 抽象类
    java 接口练习题6
    java 接口练习题5
    java 接口练习题4
    java 接口练习题3
    java接口练习题2
    java 接口练习题1
    java 泛型
  • 原文地址:https://www.cnblogs.com/chengbo/p/210777.html
Copyright © 2011-2022 走看看