ASP.NET Razor Page服务器端验证失败后下拉列表丢失数据
.NET Identity注册页面验证失败后下拉列表数据丢失的解决方案
问题根源
当服务器端验证失败调用return Page()时,只会重新渲染页面,不会触发OnGetAsync方法。而你仅在OnGetAsync中初始化了下拉列表的RoleList和CompanyList集合,因此验证失败后这两个集合为空,导致下拉列表数据丢失;而其他表单字段因ModelState保留了提交值,所以能正常显示。
解决方案
将下拉列表的初始化逻辑抽为独立方法,在OnGetAsync和OnPostAsync验证失败时都调用该方法,重新填充下拉数据。
步骤1:抽取初始化下拉列表的方法
在页面模型类中添加私有方法,统一处理下拉数据的填充:
private void PopulateDropdownLists() { Input.RoleList = _roleManager.Roles.Select(x => x.Name).Select(i => new SelectListItem { Text = i, Value = i }); Input.CompanyList = _unitOfWork.Company.GetAll().Select(i => new SelectListItem { Text = i.Name, Value = i.Id.ToString() }); }
步骤2:修改OnGetAsync方法
将原有的下拉列表初始化代码替换为调用上述方法:
public async Task OnGetAsync(string returnUrl = null) { // 原有其他代码... Input = new InputModel(); PopulateDropdownLists(); }
步骤3:修改OnPostAsync方法
在return Page()之前调用PopulateDropdownLists(),确保验证失败后下拉数据被重新填充:
public async Task<IActionResult> OnPostAsync(string returnUrl = null) { // 原有其他代码... // If we got this far, something failed, redisplay form PopulateDropdownLists(); return Page(); }
补充说明
RoleList和CompanyList标记了[ValidateNever],ModelState不会保留它们的值,必须手动重新填充。- 抽取独立方法可避免代码重复,提升后续维护性。
内容的提问来源于stack exchange,提问作者Yuanpeng Li
相关产品推荐
相关产品推荐

