.NET Core Razor Pages中提交表单后如何在视图中保留模型数据?
在Razor Pages提交表单后保留模型数据的解决方案
嘿,这个场景我太熟悉了!在ASP.NET Core Razor Pages里,因为HTTP是无状态的,Post请求执行完后,之前Get请求加载的模型数据不会自动保留,得手动处理才行。我给你分享几个最实用的办法:
1. 在OnPost方法中重新加载数据(最推荐)
这是最直接也最不容易出错的方式。不管表单验证成功还是失败,只要你要返回当前页面,就重新调用加载数据的方法,把Projets属性重新赋值。
你可以把加载数据的逻辑抽成一个私有方法,避免重复代码:
public IList<Projet> Projets { get; set; } public LoginData LoginData { get; set; } // 对应你表单里的LoginData模型 public ActionResult OnGet() { LoadProjets(); return Page(); } public ActionResult OnPost() { // 先做表单验证 if (!ModelState.IsValid) { // 验证失败时,必须重新加载Projets,否则视图里这个列表会是空的 LoadProjets(); return Page(); } // 这里处理你的表单提交逻辑,比如保存LoginData到数据库等 // 即使验证成功,如果还停留在当前页面,也要重新加载Projets LoadProjets(); return Page(); } // 抽出来的加载数据方法,复用性更强 private void LoadProjets() { Projets = _serviceSelect.getProjets(); }
为什么这个方法靠谱?因为每次请求(不管Get还是Post)都是独立的,Post请求不会继承Get请求的模型数据,所以必须手动重新加载。
2. 用TempData暂存数据(适合小数据量)
如果你的Projets数据量不大,也可以用TempData来暂存,避免重复调用数据库。TempData是ASP.NET Core里用来跨请求传递数据的容器,默认基于Session实现。
// 引用System.Text.Json命名空间 using System.Text.Json; public IList<Projet> Projets { get; set; } public LoginData LoginData { get; set; } public ActionResult OnGet() { Projets = _serviceSelect.getProjets(); // 把Projets序列化成JSON存到TempData里 TempData["Projets"] = JsonSerializer.Serialize(Projets); return Page(); } public ActionResult OnPost() { // 处理表单逻辑... // 从TempData恢复Projets数据 if (TempData["Projets"] != null) { Projets = JsonSerializer.Deserialize<IList<Projet>>(TempData["Projets"].ToString()); // 如果需要后续请求还能用到这个数据,调用Keep() TempData.Keep("Projets"); } else { // 兜底,万一TempData失效了,重新加载 LoadProjets(); } return Page(); } private void LoadProjets() { Projets = _serviceSelect.getProjets(); }
注意:TempData里的数据默认在读取一次后就会被标记为删除,所以如果需要多次使用,记得调用TempData.Keep("键名")或者用TempData.Peek("键名")来读取。
3. 确保表单控件的回显(针对LoginData)
你表单里的radio按钮用了asp-for标签助手,它会自动从ModelState里取值,而不是直接从模型属性取。所以在OnPost方法里,不要重置LoginData,这样即使验证失败,之前选中的radio状态会自动保留。
比如不要做这种操作:
// 错误示例:不要在验证失败时重新初始化LoginData LoginData = new LoginData();
只要你不清除ModelState,也不重新赋值LoginData,asp-for会自动回显用户之前提交的选择。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

