c# - ASP.NET Core 路由引擎混淆
问题描述
我正在尝试创建一个可靠的示例来说明 ASP.NET Core 路由引擎的工作原理,结果令我感到惊讶。
此示例背后的前提是点击控制器索引页面,然后使用 AJAX 请求加载数据。
我用 MVC 创建了一个 ASP.Net Core 应用程序。然后我添加了以下控制器:
namespace WebApplication2.Controllers {
using Microsoft.AspNetCore.Mvc;
public class SearchController : Controller {
public IActionResult Index() {
return View();
}
[HttpGet("{company}")]
public IActionResult Get(string company) {
return Ok($"company: {company}");
}
[HttpGet("{country}/{program}")]
public IActionResult Get(string country, string program) {
return Ok($"country: {country} program: {program}");
}
}
}
我还创建了一个简单的视图,以与带有“搜索页面”字样的索引一起使用,以便您可以看到它被调用。
问题是由此创建的路由没有意义。
预期成绩
- /搜索/索引
- /搜索/{公司}
- /搜索/{国家}/{程序}
以公司:“Abc”,国家:“加拿大”和程序:“管道”为例:
/搜索/索引
产生:“搜索页面”
/搜索/美国广播公司
产生“公司:Abc”
/搜索/加拿大/水暖
生产:“国家:加拿大计划:管道”
实际结果
然而,它根本不像这样工作。相反,这些是结果:
- /搜索/索引
产生:“国家:搜索程序:索引”
- /搜索/美国广播公司
产生:“国家:搜索程序:Abc”
- /搜索/加拿大/水暖
产生:404 未找到
显然 Index 和 Get string company 的路由是混淆的,它将控制器名称作为参数。
我可以使用以下代码使其工作,但我认为路由引擎会产生相同的结果:
public class SearchController : Controller {
public IActionResult Index() {
return View();
}
[HttpGet("[controller]/{company}")]
public IActionResult Get(string company) {
return Ok($"company: {company}");
}
[HttpGet("[controller]/{country}/{program}")]
public IActionResult Get(string country, string program) {
return Ok($"country: {country} program: {program}");
}
我的理解有什么问题?必须明确指定似乎很愚蠢[controller]
。
解决方案
指定类上方的根路由
[Route("Search")]
public class SearchController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpGet("{company}")]
public IActionResult Get(string company)
{
return Ok($"company: {company}");
}
[HttpGet("{country}/{program}")]
public IActionResult Get(string country, string program)
{
return Ok($"country: {country} program: {program}");
}
}