在ASP.NET Core中使用Attribute Routing时,可能会遇到一个bug,即如果在Controller中定义了一个路由,同时在Action中也定义了一个路由,那么路由不会按照预期的方式工作。如下面的代码,这里定义了一个Controller级别的路由和一个Action级别的路由:
[Route("test")]
public class TestController : Controller
{
[HttpGet]
public IActionResult Index()
{
return View();
}
[HttpGet("details")]
public IActionResult Details()
{
return View();
}
}
这里的预期行为是,当访问“/test/details”时,会调用Details()方法,但实际上会调用Index()方法。这是因为路由系统认为“/test/details”匹配到了Controller级别的路由,因此不再继续匹配Action级别的路由。
解决这个问题的方法是,将Controller级别的路由和Action级别的路由合并成一个路由。修改上面的代码如下:
[Route("test")]
public class TestController : Controller
{
[HttpGet]
[Route("")]
public IActionResult Index()
{
return View();
}
[HttpGet("details")]
public IActionResult Details()
{
return View();
}
}
这里将Controller级别的路由和Action级别的路由合并成了一个路由,并用Route("")指示Index()方法的路由是空字符串。这样就能正确匹配到Action级别的路由了。