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

Chrome点击返回至搜索页出错问题的排查与解决方案

问题:搜索后点击浏览器返回按钮出现表单重提交错误

问题详情

SearchController代码如下:

namespace Bejebeje.Mvc.Controllers
{
  using System.Threading.Tasks;
  using Bejebeje.Models.Search;
  using Microsoft.AspNetCore.Mvc;
  using Services.Services.Interfaces;

  public class SearchController : Controller
  {
    private readonly ILyricsService _lyricsService;

    private readonly IArtistsService _artistsService;

    public SearchController(
      ILyricsService lyricsService,
      IArtistsService artistsService)
    {
      _lyricsService = lyricsService;
      _artistsService = artistsService;
    }

    [HttpGet]
    public IActionResult Index()
    {
      SearchViewModel viewModel = new SearchViewModel();

      return View(viewModel);
    }

    [HttpPost]
    public async Task<IActionResult> Index(string searchTerm)
    {
      SearchViewModel viewModel = new SearchViewModel();

      if (string.IsNullOrEmpty(searchTerm))
      {
        return View(viewModel);
      }

      viewModel.SearchTerm = searchTerm;

      viewModel.Artists = await _artistsService
        .SearchArtistsAsync(searchTerm);

      viewModel.Lyrics = await _lyricsService
        .SearchLyricsAsync(searchTerm);

      return View(viewModel);
    }
  }
}

问题重现步骤:

  • 访问网站首页
  • 搜索艺术家(例如:Şivan)
  • 点击搜索结果中的艺术家(Şivan Perwer)
  • 点击浏览器返回按钮
  • Chrome浏览器显示表单重提交错误

问题成因

当前搜索功能使用POST请求提交搜索关键词,浏览器会将POST请求的历史记录标记为“可能触发重复操作”的请求。当用户点击返回按钮时,浏览器尝试重新发送该POST请求,为避免重复提交风险(比如重复创建数据),Chrome会拦截并弹出错误提示。

而Stack Overflow这类网站的搜索功能采用GET请求,GET请求会将搜索参数直接拼接在URL中,后退时浏览器只需加载该URL对应的页面,不会触发表单重提交的安全校验,因此能正常显示之前的搜索结果。

解决方案

将搜索请求从POST改为GET,具体修改如下:

1. 修改控制器代码

合并GET和POST方法,统一处理带搜索参数的GET请求:

namespace Bejebeje.Mvc.Controllers
{
  using System.Threading.Tasks;
  using Bejebeje.Models.Search;
  using Microsoft.AspNetCore.Mvc;
  using Services.Services.Interfaces;

  public class SearchController : Controller
  {
    private readonly ILyricsService _lyricsService;
    private readonly IArtistsService _artistsService;

    public SearchController(
      ILyricsService lyricsService,
      IArtistsService artistsService)
    {
      _lyricsService = lyricsService;
      _artistsService = artistsService;
    }

    [HttpGet]
    public async Task<IActionResult> Index(string searchTerm = null)
    {
      SearchViewModel viewModel = new SearchViewModel();

      if (!string.IsNullOrEmpty(searchTerm))
      {
        viewModel.SearchTerm = searchTerm;
        viewModel.Artists = await _artistsService.SearchArtistsAsync(searchTerm);
        viewModel.Lyrics = await _lyricsService.SearchLyricsAsync(searchTerm);
      }

      return View(viewModel);
    }
  }
}

2. 修改前端表单

找到搜索页面的form标签,将method="post"替换为method="get"。修改后,提交搜索时参数会自动拼在URL中,用户返回时浏览器直接加载该URL,即可正常显示之前的搜索结果,和Stack Overflow的行为一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:15:56