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

