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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:45:16