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
相关产品推荐
相关产品推荐

