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
相关产品推荐
相关产品推荐

