首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET jQuery AJAX 實現無刷新評論系統完整範例

     編輯:ASP.NET 基礎

資料庫設計

CREATE TABLE Comments (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    UserName NVARCHAR(50) NOT NULL,
    Message NVARCHAR(MAX) NOT NULL,
    CreateTime DATETIME DEFAULT GETDATE()
);

前端頁面 (HTML + jQuery)

<!DOCTYPE html>
<html>
<head>
    <title>AJAX 無刷新評論示範</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <table id="commentList"><!-- 評論列表容器 --></table>
    
    <div>
        用戶名:<input id="txtUser" type="text" /><br />
        內容:<textarea id="txtMsg" rows="5" cols="40"></textarea><br />
        <input id="btnSubmit" type="button" value="提交評論" />
    </div>

    <script>
        $(function () {
            // 1. 頁面載入:讀取現有評論
            loadComments();

            // 2. 提交按鈕點擊
            $("#btnSubmit").click(function () {
                var user = $("#txtUser").val().trim();
                var msg = $("#txtMsg").val().trim();
                if (!user || !msg) { alert("請填寫完整"); return; }

                $.post("Handler/CommentHandler.ashx", { action: "add", user: user, msg: msg }, function (res) {
                    if (res.success) {
                        // 直接在前端追加新評論,無需重新查詢
                        appendComment(user, msg);
                        $("#txtMsg").val("");
                    } else {
                        alert("提交失敗:" + res.error);
                    }
                }, "json");
            });
        });

        function loadComments() {
            $.getJSON("Handler/CommentHandler.ashx?action=list", function (data) {
                if (data.success) {
                    data.comments.forEach(appendComment);
                }
            });
        }

        function appendComment(user, msg) {
            var html = `${user} 說:${msg}`;
            $("#commentList").append(html);
        }
    </script>
</body>
</html>

後端 Generic Handler (CommentHandler.ashx)

<%@ WebHandler Language="C#" Class="CommentHandler" %>
using System;
using System.Web;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;

public class CommentHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
    string connStr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/json; charset=utf-8";
        string action = context.Request["action"];

        try
        {
            if (action == "list")
            {
                var list = new List();
                using (var conn = new SqlConnection(connStr))
                using (var cmd = new SqlCommand("SELECT UserName, Message FROM Comments ORDER BY CreateTime DESC", conn))
                {
                    conn.Open();
                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            list.Add(new { user = reader["UserName"], msg = reader["Message"] });
                        }
                    }
                }
                context.Response.Write($"{{\"success\":true,\"comments\":{Newtonsoft.Json.JsonConvert.SerializeObject(list)}}}");
            }
            else if (action == "add")
            {
                string user = context.Request["user"];
                string msg = context.Request["msg"];
                
                using (var conn = new SqlConnection(connStr))
                using (var cmd = new SqlCommand("INSERT INTO Comments (UserName, Message) VALUES (@u, @m)", conn))
                {
                    cmd.Parameters.AddWithValue("@u", user);
                    cmd.Parameters.AddWithValue("@m", msg);
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
                context.Response.Write("{\"success\":true}");
            }
            else
            {
                context.Response.Write("{\"success\":false,\"error\":\"Invalid action\"}");
            }
        }
        catch (Exception ex)
        {
            context.Response.Write($"{{\"success\":false,\"error\":\"{ex.Message.Replace("\"", "\\\"")}\"}}");
        }
    }

    public bool IsReusable => false;
}

關鍵點總結

  1. 前端模板渲染:伺服端只回傳 JSON 資料,前端負責 HTML 組裝,減少頻寬、分離關注點。
  2. 參數化查詢:防止 SQL 注入,cmd.Parameters.AddWithValue。
  3. JSON 回應統一格式:{success:bool, data..., error:string},前端統一判斷 res.success。
  4. Handler 合併動作:單一 .ashx 透過 action 參數處理列表/新增,RESTful 風格可改用 Web API。
  5. XSS 防護:前端顯示用戶輸入時務必編碼 (如 textContent 或編碼函式),範例為簡化直接插入 HTML,實務必處理。

擴充建議

  • 分頁載入:action=list&page=1&size=20。
  • 巢狀回覆:資料表加 ParentId,前端遞迴渲染。
  • 即時推播:SignalR / WebSocket 實現新評論即時顯示。
  • 驗證碼/頻率限制:防刷評論。

總結

本例展示 ASP.NET + jQuery AJAX + Generic Handler 實現無刷新評論系統的完整流程:資料表設計、前端載入/提交/渲染、後端 JSON API、參數化 SQL、統一錯誤處理。架構簡單清晰,易於擴充為生產級功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved