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

ASP.NET MVC PRG 模式:Post-Redirect-Get 杜絕重複提交與瀏覽器警告

     編輯:關於ASP.NET

問題:表單送出後重新整理 → 瀏覽器彈出「確定要重新提交嗎?」

瀏覽器重新提交警告

使用者送出表單(POST),伺服器直接回傳 HTML(200 OK)。此時重新整理會再次送出 POST,導致重複下單、重複扣款等嚴重後果。

PRG 模式定義

Post / Redirect / Get:

  1. 瀏覽器 POST 表單至伺服器。
  2. 伺服器處理完成,不直接回傳 HTML,而是回傳 302/303 重導向(含 Location 標頭)。
  3. 瀏覽器自動 GET Location 指定的 URL。
  4. 結果頁面可安全加入書籤、重新整理、分享,無副作用。

PRG 流程圖

WebForms vs MVC 實作難易度

  • WebForms:PostBack 模型綁定按鈕點擊於同一頁面,PRG 需手動 Response.Redirect 並處理 ViewState/控制項狀態,極繁瑣。
  • MVC:Action 天然分離 GET/POST,return RedirectToAction(...) 一行搞定。

MVC 實戰範例:登入功能

public class AccountController : Controller {
    // GET: 顯示登入頁
    public ActionResult Login() {
        return View();
    }

    // POST: 處理登入提交
    [HttpPost]
    public ActionResult Login(LoginViewModel model, string returnUrl) {
        if (!ModelState.IsValid) return View(model);

        if (Membership.ValidateUser(model.UserName, model.Password)) {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            // PRG 關鍵:重導向而非直接回傳 View
            return RedirectToAction("Index", "Home"); // 或 return Redirect(returnUrl);
        }

        ModelState.AddModelError("", "帳號或密碼錯誤");
        return View(model); // 驗證失敗留在原頁(POST → View 例外情況)
    }
}

進階:TempData 傳遞成功訊息

[HttpPost]
public ActionResult Create(Product product) {
    if (ModelState.IsValid) {
        _repo.Add(product);
        TempData["SuccessMessage"] = "產品已新增"; // 只存活一個請求
        return RedirectToAction("Index"); // PRG
    }
    return View(product);
}

// Index.cshtml
@if (TempData["SuccessMessage"] != null) {
    
@TempData["SuccessMessage"]
}

PRG 最佳實務檢查表

  • [ ] 所有異動操作(Create/Edit/Delete/登入/登出)Action 皆回傳 RedirectToAction/Redirect。
  • [ ] 重導向目標為 GET Action(通常為 Index/Details/列表頁)。
  • [ ] 使用 TempData 跨請求傳遞一次性訊息(成功/錯誤)。
  • [ ] 驗證失敗時才回傳 View(model) 保留輸入與錯誤訊息(POST → View 為唯一例外)。
  • [ ] 避免在 GET Action 執行異動邏輯(違反 HTTP 語意)。

徹底落實 PRG,即可消除重複提交、瀏覽器警告、書籤失效等經典 Web 應用痛點,是 MVC 開發者的必修內功。

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