ZetCode

ASP.NET TempData

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 TempData。TempData 是一个字典对象,用于在重定向期间在控制器和视图之间传递数据。

ASP.NET 是一个跨平台、高性能的框架,用于构建现代 Web 应用程序。TempData 提供了一种在请求之间维护状态的简单方法。

基本定义

TempData 是 ASP.NET 中 ControllerBase 类的属性。它会在两个连续请求之间临时存储数据。数据仅在读取或请求完成之前可用。

TempData 在后台使用会话状态,但专门为重定向场景设计。它通常用于在重定向期间在操作之间传递消息或小数据。

与 ViewData 和 ViewBag 不同,TempData 会持续到额外的请求。它根据配置,使用 Cookie 或会话状态来实现。

ASP.NET TempData 示例

以下示例演示了如何使用 TempData 在表单提交和重定向期间在操作之间传递成功消息。

Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();
builder.Services.AddSession(); // Required for TempData

var app = builder.Build();

app.UseSession(); // Required for TempData
app.MapControllers();
app.MapDefaultControllerRoute();
app.Run();

这设置了一个基本的 ASP.NET MVC 应用程序,并支持会话。要使 TempData 正确工作,需要调用 AddSessionUseSession

Controllers/ProductController.cs
using Microsoft.AspNetCore.Mvc;

public class ProductController : Controller
{
    private static List<Product> _products = new()
    {
        new Product(1, "Laptop", 999.99m),
        new Product(2, "Mouse", 19.99m)
    };

    public IActionResult Index()
    {
        return View(_products);
    }

    public IActionResult Create()
    {
        return View();
    }

    [HttpPost]
    public IActionResult Create(Product product)
    {
        if (!ModelState.IsValid)
        {
            return View(product);
        }

        product.Id = _products.Max(p => p.Id) + 1;
        _products.Add(product);

        TempData["SuccessMessage"] = $"Product {product.Name} created successfully!";
        return RedirectToAction(nameof(Index));
    }
}

public record Product(int Id, string Name, decimal Price);

此控制器演示了 TempData 的用法。创建产品后,我们在重定向到 Index 操作之前将成功消息存储在 TempData 中。

Views/Product/Index.cshtml
@model List<Product>

@if (TempData["SuccessMessage"] != null)
{
    <div class="alert alert-success">
        @TempData["SuccessMessage"]
    </div>
}

<h2>Products</h2>
<table class="table">
    <thead>
        <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Price</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var product in Model)
        {
            <tr>
                <td>@product.Id</td>
                <td>@product.Name</td>
                <td>@product.Price.ToString("C")</td>
            </tr>
        }
    </tbody>
</table>

视图会检查 TempData 消息,如果存在则显示。消息将在设置后仅在下一个请求中可用。

TempData 特别适用于 Post-Redirect-Get (PRG) 模式。它有助于避免表单重复提交问题,同时仍向用户提供反馈。

在此示例中,成功消息将仅显示一次。如果刷新页面,由于 TempData 在读取后会被清除,因此消息将不再出现。

来源

Microsoft ASP.NET TempData 文档

在本文中,我们探讨了 ASP.NET 8 中的 TempData。这项强大的功能简化了在重定向期间在操作之间传递数据,同时保持了清晰的应用程序流程。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程