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

ASP.NET Core Razor Pages中如何传递提交的客户数据并在跳转页显示最新数据库条目

解决方案:ASP.NET Core Razor Pages 提交后传递数据到展示页面

嘿,我来帮你解决这个问题!你遇到的核心问题是提交数据后,没办法把刚创建的Customer对象传递到RegistrationSuccess页面,同时还要保证数据能正确存入数据库。下面给你两种简单可行的解决方案:

方案一:通过ID从数据库查询最新数据(推荐)

这种方式最稳妥,因为数据已经存入数据库,我们只需要在跳转时传递Customer的ID,然后在展示页面根据ID查询出完整数据。

1. 修改Create页面的后台代码(Create.cshtml.cs)

在OnPostAsync方法中,保存数据后跳转时带上刚创建的Customer的ID:

using Microsoft.EntityFrameworkCore; // 确保添加这个引用

public async Task<IActionResult> OnPostAsync()
{
    // 先验证模型有效性,避免无效数据入库
    if (!ModelState.IsValid)
    {
        return Page();
    }

    _context.Customer.Add(Customer);
    await _context.SaveChangesAsync();

    // 传递刚创建的Customer的ID到RegistrationSuccess页面
    return RedirectToPage("/Customers/RegistrationSuccess", new { id = Customer.Id });
}

2. 修改RegistrationSuccess页面的后台代码(RegistrationSuccess.cshtml.cs)

更新OnGet方法,接收ID并从数据库查询对应的Customer:

using Microsoft.EntityFrameworkCore;

public class RegistrationSuccessModel : PageModel
{
    [BindProperty]
    public Customer Customer { get; set; }
    private readonly CustomerManagementSystem.Data.CustomerManagementSystemContext _context;

    public RegistrationSuccessModel(CustomerManagementSystem.Data.CustomerManagementSystemContext context)
    {
        _context = context;
    }

    public async Task<IActionResult> OnGet(int id)
    {
        // 根据ID从数据库查询Customer
        Customer = await _context.Customer.FindAsync(id);
        
        // 如果没找到对应数据,跳回创建页面
        if (Customer == null)
        {
            return RedirectToPage("/Customers/Create");
        }
        return Page();
    }

    // 不需要OnPostAsync的话可以删掉,因为我们是通过Get跳转的
    // public async Task<IActionResult> OnPostAsync()
    // {
    //     return RedirectToPage("/Customers/RegistrationSuccess");
    // }
}

方案二:使用TempData临时传递数据

如果你不想再查一次数据库,可以用TempData在页面跳转时临时存储Customer对象(适合一次性展示场景)。

1. 修改Create页面的后台代码(Create.cshtml.cs)

保存数据后,把Customer序列化为JSON存入TempData:

using System.Text.Json;

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    _context.Customer.Add(Customer);
    await _context.SaveChangesAsync();

    // 将Customer序列化为JSON存入TempData
    TempData["Customer"] = JsonSerializer.Serialize(Customer);
    return RedirectToPage("/Customers/RegistrationSuccess");
}

2. 修改RegistrationSuccess页面的后台代码(RegistrationSuccess.cshtml.cs)

在OnGet方法中读取TempData并反序列化为Customer对象:

using System.Text.Json;

public IActionResult OnGet()
{
    var customerJson = TempData["Customer"] as string;
    
    // 如果没有获取到数据,跳回创建页面
    if (string.IsNullOrEmpty(customerJson))
    {
        return RedirectToPage("/Customers/Create");
    }

    // 反序列化为Customer对象
    Customer = JsonSerializer.Deserialize<Customer>(customerJson);
    return Page();
}

为什么你之前的方法会出错?

  • 直接在form中设置asp-page="RegistrationSuccess"时,表单会提交到RegistrationSuccess页面的OnPostAsync,而不会执行Create页面的OnPostAsync,所以数据根本没有存入数据库。
  • 原来的RegistrationSuccess页面OnGet方法没有获取任何数据,导致Model.Customer为null,渲染页面时就会抛出NullReferenceException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:08:12