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

如何在.NET Core Razor页面提交后保留模型筛选值

解决Razor页面提交模态框后筛选控件重置的问题

问题核心是提交新建记录后重定向回Index页面时,没有携带之前的筛选参数,导致筛选控件回到初始状态。以下是具体解决方案:

1. 重定向时传递筛选参数

修改模态框的Post处理方法,在重定向时将当前所有筛选参数(如Division)一并传递,确保OnGetAsync能获取到之前的筛选值:

public async Task<IActionResult> OnPostCreateNewRecordAsync(GasProject gasProject)
{
    if (!ModelState.IsValid)
    {
        // ModelState无效时,重新初始化下拉框并保留筛选状态
        await InitializeSelectLists();
        GasProjects = await QueryProjects();
        return Page();
    }

    // 执行保存逻辑
    _context.GasProjects.Add(gasProject);
    await _context.SaveChangesAsync();

    // 重定向时携带所有筛选参数
    return RedirectToPage("Index", new 
    { 
        Division = Division,
        // 如果有其他筛选参数(如OpCo、Municipality),一并添加在此
    });
}

2. 复用下拉框初始化逻辑

为避免重复代码,新增初始化SelectList的私有方法,同时确保所有筛选参数都标记为[BindProperty(SupportsGet = true)],让OnGetAsync自动绑定查询字符串中的参数:

public class IndexModel : PageModel
{
    public SelectList? Divisions { get; set; }
    public SelectList? OpCos { get; set; }
    public SelectList? Municipalities { get; set; }
    public SelectList? DesignPhases { get; set; }
    public SelectList? Designers { get; set; }

    [BindProperty(SupportsGet = true)]
    public string? Division { get; set; }
    [BindProperty(SupportsGet = true)]
    public string? OpCo { get; set; }
    // 其他筛选参数同理添加BindProperty标记

    private async Task InitializeSelectLists()
    {
        // 初始化Division下拉框
        var divisionQuery = from m in _context.GasProjects
                           where !string.IsNullOrEmpty(m.Division)
                           orderby m.Division
                           select m.Division;
        Divisions = new SelectList(await divisionQuery.Distinct().ToListAsync(), Division);

        // 初始化OpCo下拉框(示例)
        var opCoQuery = from m in _context.GasProjects
                       where !string.IsNullOrEmpty(m.OpCo)
                       orderby m.OpCo
                       select m.OpCo;
        OpCos = new SelectList(await opCoQuery.Distinct().ToListAsync(), OpCo);

        // 其他下拉框同理初始化
    }

    public async Task OnGetAsync()
    {
        await InitializeSelectLists();
        GasProjects = await QueryProjects();
    }
}

3. 处理ModelState无效的场景

当表单验证失败返回Page()时,不会自动触发OnGetAsync,因此需要手动调用InitializeSelectLists()重新生成下拉框选项,并保留当前筛选参数,确保页面渲染时筛选控件状态正确。

补充说明

  • .NET Core Razor Pages没有ViewState,所以依赖ViewState的方案不可行。
  • 服务器端传递参数的方案比JavaScript本地存储更可靠,即使客户端禁用JS也能正常工作。

内容的提问来源于stack exchange,提问作者HarpuaMM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:42:36