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

ASP.NET Core 3.1添加搜索功能后遇多端点匹配错误求助

解决ASP.NET Core 3.1中“The request matched multiple endpoints”错误

问题根源

你在DemoController中添加搜索功能后,存在两个标记为[HttpPost]的Index方法:

  • 处理文件上传的[HttpPost] public IActionResult Index(IFormFile files)
  • 处理搜索的[HttpPost] public async Task<IActionResult> Index(string searchString)

ASP.NET Core路由系统匹配请求时,会先根据HTTP方法和路由模板筛选端点。这两个方法的路由模板都是默认的/Demo/Index,系统无法通过参数差异区分对该路径的POST请求应该路由到哪个方法,因此抛出端点匹配冲突错误。

解决方案

方案1:给POST方法指定不同的路由模板

通过[Route]属性为其中一个POST方法设置独特的路由,避免路径冲突:

修改文件上传的POST方法:

[HttpPost("UploadFile")]
public IActionResult Index(IFormFile files)
{
    // 原文件上传逻辑不变
    if (files != null)
    {
        if (files.Length > 0)
        {
            var fileName = Path.GetFileName(files.FileName);
            var fileExtension = Path.GetExtension(fileName);
            var newFileName = String.Concat(Guid.NewGuid(), fileExtension);

            var objfiles = new Files()
            {
                DocumentId = 0,
                Name = newFileName,
                FileType = fileExtension,
            };

            using (var target = new MemoryStream())
            {
                files.CopyTo(target);
                objfiles.DataFiles = target.ToArray();
            }

            _context.Files.Add(objfiles);
            _context.SaveChanges();
        }
    }

    return RedirectToAction("Index");
}

修改搜索的POST方法:

[HttpPost("Search")]
public async Task<IActionResult> Index(string searchString)
{
    var fileQuery = from m in _context.Files select m;

    if (!String.IsNullOrEmpty(searchString))
    {
        fileQuery = fileQuery.Where(s => s.Name!.Contains(searchString));
    }

    return View(await fileQuery.ToListAsync());
}

此时文件上传请求路径为/Demo/UploadFile,搜索请求路径为/Demo/Search,不再冲突。同时需要对应修改前端表单的action属性,指向新的路由。

方案2:合并两个POST方法

将文件上传和搜索逻辑合并到同一个POST方法中,通过参数存在性判断执行对应逻辑:

[HttpPost]
public async Task<IActionResult> Index(IFormFile files, string searchString)
{
    // 处理文件上传逻辑
    if (files != null && files.Length > 0)
    {
        var fileName = Path.GetFileName(files.FileName);
        var fileExtension = Path.GetExtension(fileName);
        var newFileName = String.Concat(Guid.NewGuid(), fileExtension);

        var objfiles = new Files()
        {
            DocumentId = 0,
            Name = newFileName,
            FileType = fileExtension,
        };

        using (var target = new MemoryStream())
        {
            files.CopyTo(target);
            objfiles.DataFiles = target.ToArray();
        }

        _context.Files.Add(objfiles);
        await _context.SaveChangesAsync();
        
        // 上传完成后重定向到Index页面展示全部数据
        return RedirectToAction("Index");
    }

    // 处理搜索逻辑
    var fileQuery = from m in _context.Files select m;
    if (!String.IsNullOrEmpty(searchString))
    {
        fileQuery = fileQuery.Where(s => s.Name!.Contains(searchString));
    }

    return View(await fileQuery.ToListAsync());
}

这种方式需要确保前端表单提交时,仅传递对应功能的参数(上传表单传files,搜索表单传searchString)。

方案3:使用[ActionName]区分端点

给其中一个POST方法设置不同的Action名称,让路由系统识别为不同的端点:

[HttpPost]
[ActionName("Search")]
public async Task<IActionResult> Index(string searchString)
{
    var fileQuery = from m in _context.Files select m;

    if (!String.IsNullOrEmpty(searchString))
    {
        fileQuery = fileQuery.Where(s => s.Name!.Contains(searchString));
    }

    return View(await fileQuery.ToListAsync());
}

此时搜索请求的路径为/Demo/Search,需要修改前端搜索表单的action为Search。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:40:41