ASP.NET Core Razor Pages提交表单后BindProperty绑定数据丢失如何解决
ASP.NET Core Razor Pages 提交表单保留原有数据解决方案
根因说明
Razor Pages的PageModel为请求作用域实例,每次HTTP请求(含GET、POST)都会重新执行构造函数初始化,仅本次请求提交的字段会被[BindProperty]特性自动绑定,未提交的属性值会默认清空。
可行解决方案
方案1:表单内置隐藏域传递全量状态(最常用,成本最低)
在每个独立表单中,添加所有需要保留的非本次提交属性的隐藏字段,提交任意表单时都会携带全量已选数据,[BindProperty]可自动完成绑定无需额外处理。
示例代码:
<!-- 提交下拉框1的独立表单 --> <form method="post"> <!-- 保留其他下拉框的已选值 --> <input type="hidden" asp-for="SelectedDropdown2" /> <input type="hidden" asp-for="SelectedDropdown3" /> <!-- 本表单提交字段 --> <select asp-for="SelectedDropdown1" asp-items="@Dropdown1Options"></select> <button type="submit" asp-page-handler="Abc">提交</button> </form> <!-- 提交下拉框2的独立表单 --> <form method="post"> <!-- 保留其他下拉框的已选值 --> <input type="hidden" asp-for="SelectedDropdown1" /> <input type="hidden" asp-for="SelectedDropdown3" /> <!-- 本表单提交字段 --> <select asp-for="SelectedDropdown2" asp-items="@Dropdown2Options"></select> <button type="submit" asp-page-handler="ABC">提交</button> </form>
注意:下拉框的选项列表需要在POST处理方法中重新初始化赋值,视图渲染时需要用到该数据。
方案2:Session存储页面状态
如果属性较多不想写大量隐藏域,可以将页面全量状态(已选值、选项列表等)存入Session,每次POST请求处理时:
- 先从Session读取上一次存储的页面状态
- 用本次提交的字段值更新状态
- 将更新后的状态重新存入Session并赋值给PageModel的对应属性
需要先在Program.cs中启用Session服务:
builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(20); options.Cookie.HttpOnly = true; }); // 中间件配置要加app.UseSession(),放在app.UseRouting()之后,app.MapRazorPages()之前
方案3:AJAX局部提交(无页面刷新,体验最优)
将表单提交改为AJAX异步请求,提交后仅更新页面需要变动的局部内容,不会触发整页刷新,原有下拉框的DOM状态会完整保留,无需处理PageModel数据丢失问题。
内容的提问来源于stack exchange,提问作者Talha Talha
相关产品推荐
相关产品推荐

