You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET WebForm实现简单留言板:提交留言并按时间倒序展示

实现ASPX留言板基础功能方案

一、调整数据库表结构

你原计划的表缺少时间字段,无法实现“最新留言置顶”的排序逻辑,必须新增一个记录提交时间的字段:

CREATE TABLE Messages (
    Id INT PRIMARY KEY IDENTITY(1,1), -- 自增主键,方便数据管理(可选但推荐)
    [From] VARCHAR(50) NOT NULL, -- 注意From是SQL关键字,需用方括号包裹
    [Message] VARCHAR(500) NOT NULL,
    CreateTime DATETIME DEFAULT GETDATE() -- 默认自动取当前提交时间
)

二、Message.aspx 提交留言逻辑

在提交按钮的点击事件中,将用户输入写入数据库,完成后跳转至留言板页面:

1. 后台C#代码(Message.aspx.cs)

using System.Configuration;
using System.Data.SqlClient;

protected void btnSubmit_Click(object sender, EventArgs e)
{
    // 获取用户输入并做简单校验
    string senderName = txtFrom.Text.Trim();
    string messageContent = txtMessage.Text.Trim();

    if (string.IsNullOrEmpty(senderName) || string.IsNullOrEmpty(messageContent))
    {
        lblTip.Text = "请填写完整的发件人和留言内容";
        return;
    }

    // 从Web.config读取数据库连接字符串
    string connStr = ConfigurationManager.ConnectionStrings["MessageBoardConn"].ConnectionString;
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        // 参数化SQL避免注入风险
        string sql = "INSERT INTO Messages ([From], [Message]) VALUES (@Sender, @Content)";
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddWithValue("@Sender", senderName);
            cmd.Parameters.AddWithValue("@Content", messageContent);
            
            conn.Open();
            cmd.ExecuteNonQuery();
        }
    }

    // 提交成功后跳转至留言板
    Response.Redirect("MessageBoard.aspx");
}

2. Web.config 配置数据库连接字符串

<configuration>
  <connectionStrings>
    <add name="MessageBoardConn" 
         connectionString="Data Source=你的数据库服务器地址;Initial Catalog=你的数据库名;Integrated Security=True;" 
         providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

三、MessageBoard.aspx 展示留言(最新置顶)

通过查询数据库时按CreateTime降序排序,实现最新留言在前,再将数据绑定到页面元素展示:

方法1:使用Repeater控件(推荐,代码更规范)

前台ASPX代码

<div id="messageContainer">
    <asp:Repeater ID="rptMessages" runat="server">
        <ItemTemplate>
            <div class="message-item">
                <p><strong>发件人:</strong><%# Eval("From") %></p>
                <p><strong>留言时间:</strong><%# Eval("CreateTime", "{0:yyyy-MM-dd HH:mm}") %></p>
                <p><strong>内容:</strong><%# Eval("Message") %></p>
                <hr />
            </div>
        </ItemTemplate>
        <EmptyDataTemplate>
            <p>暂无留言,快来发布第一条吧!</p>
        </EmptyDataTemplate>
    </asp:Repeater>
</div>

后台C#代码(MessageBoard.aspx.cs)

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindMessages();
    }
}

private void BindMessages()
{
    string connStr = ConfigurationManager.ConnectionStrings["MessageBoardConn"].ConnectionString;
    List<MessageInfo> messageList = new List<MessageInfo>();

    using (SqlConnection conn = new SqlConnection(connStr))
    {
        // 核心:按CreateTime降序查询,实现最新留言置顶
        string sql = "SELECT [From], [Message], CreateTime FROM Messages ORDER BY CreateTime DESC";
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            conn.Open();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    messageList.Add(new MessageInfo
                    {
                        Sender = reader["From"].ToString(),
                        Content = reader["Message"].ToString(),
                        SubmitTime = Convert.ToDateTime(reader["CreateTime"])
                    });
                }
            }
        }
    }

    rptMessages.DataSource = messageList;
    rptMessages.DataBind();
}

// 定义留言数据模型
public class MessageInfo
{
    public string Sender { get; set; }
    public string Content { get; set; }
    public DateTime SubmitTime { get; set; }
}

方法2:直接拼接HTML字符串(适合简单场景)

前台ASPX代码

<div id="messageContainer" runat="server"></div>

后台C#代码

using System.Text;
using System.Configuration;
using System.Data.SqlClient;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        RenderMessages();
    }
}

private void RenderMessages()
{
    string connStr = ConfigurationManager.ConnectionStrings["MessageBoardConn"].ConnectionString;
    StringBuilder htmlBuilder = new StringBuilder();

    using (SqlConnection conn = new SqlConnection(connStr))
    {
        string sql = "SELECT [From], [Message], CreateTime FROM Messages ORDER BY CreateTime DESC";
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            conn.Open();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (!reader.HasRows)
                {
                    htmlBuilder.Append("<p>暂无留言,快来发布第一条吧!</p>");
                }
                else
                {
                    while (reader.Read())
                    {
                        // HTML编码防止XSS攻击
                        string sender = Server.HtmlEncode(reader["From"].ToString());
                        string content = Server.HtmlEncode(reader["Message"].ToString());
                        string time = Convert.ToDateTime(reader["CreateTime"]).ToString("yyyy-MM-dd HH:mm");

                        htmlBuilder.Append("<div class='message-item'>");
                        htmlBuilder.Append($"<p><strong>发件人:</strong>{sender}</p>");
                        htmlBuilder.Append($"<p><strong>留言时间:</strong>{time}</p>");
                        htmlBuilder.Append($"<p><strong>内容:</strong>{content}</p>");
                        htmlBuilder.Append("<hr /></div>");
                    }
                }
            }
        }
    }

    messageContainer.InnerHtml = htmlBuilder.ToString();
}

内容的提问来源于stack exchange,提问作者Anton Tonchev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:10:13