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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:15:31