.NET5 ASP Razor Pages Post提交后BindProperties绑定的筛选值丢失
问题解决方法
核心问题原因
你遇到的筛选条件丢失问题核心原因非常明确:视图中的输入框没有绑定PageModel属性的回填值。
你已经加了[BindProperties]特性,提交表单时UserNameFilter已经成功绑定到你输入的值,OnPost方法执行完成后这个属性是有正确值的,只是渲染视图时没有把这个值写到输入框的value属性中,所以看起来像丢失了。而UserInfos是你主动在视图中遍历输出的,所以能正常显示。
最快修复方案
把UserList.cshtml里的输入行替换成下面的代码即可:
<input type="text" asp-for="UserNameFilter" />
asp-for是Razor Pages自带的TagHelper,会自动完成3件事:
- 生成正确的
name、id属性,保证模型绑定正常 - 自动把
Model.UserNameFilter的值回填到输入框的value属性 - 自动适配数据验证规则(后续加验证不需要改视图)
额外优化建议
- 筛选功能优先使用
GET请求而非POST:
把表单的method="post"改成method="get",然后把OnPost里的逻辑合并到OnGet中,代码如下:
用GET的好处是筛选参数会出现在URL中,用户可以收藏筛选后的页面,刷新、回退都不会出现表单重复提交的提示,更符合筛选场景的最佳实践。public void OnGet() { var userInfoFilter = new UserInfoFilter { UserName = UserNameFilter }; UserInfos = _userService.GetUserInfoList(userInfoFilter).ToList(); } - 不要在列表页展示用户密码明文,属于严重的安全漏洞,建议直接删除密码列。
- 你之前查阅的TempData不适用于这个场景,TempData是用于跨请求传递数据(比如Redirect跳转后传提示信息),你这个是同一次请求内渲染视图,完全不需要用到。
内容的提问来源于stack exchange,提问作者Cedric Royer-Bertrand
相关产品推荐
相关产品推荐

