【发布时间】:2019-09-13 20:36:01
【问题描述】:
我正在尝试创建一个可靠的示例来说明 ASP.NET Core 路由引擎的工作原理,结果令我感到惊讶。
本示例背后的前提是点击控制器索引页面,然后使用 AJAX 请求加载数据。
我使用 MVC 创建了一个 ASP.Net Core 应用程序。然后我添加了以下Controller:
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”,国家:“加拿大”和项目:“Plumbing”为例:
-
/搜索/索引
产生:“搜索页面”
-
/搜索/Abc
产生“公司:Abc”
-
/搜索/加拿大/水暖
产生:“国家:加拿大程序:管道”
实际结果
但是它根本不像这样工作。相反,这些是结果:
- /搜索/索引
产生:“国家:搜索程序:索引”
- /搜索/Abc
产生:“国家:搜索程序:Abc”
- /搜索/加拿大/水暖
产生:404 未找到
显然 Index 和 Get string company 的路由混淆了,它把 Controller 的名字当作参数。
我可以使用以下代码使其工作,但我认为路由引擎会产生相同的结果:
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] 似乎很愚蠢。
【问题讨论】:
-
将基本路由添加到 SearchController 类似这样的 [Route("api/[controller]")] SearchController
-
要使用约定基路由,需要在启动文件中添加
app.UseMvc(routes => { routes.MapRoute(template: "{controller}/{action}");});
标签: c# asp.net-core