我有一个用 NET Core 2.1 编写的项目,其中有一堆带有属性路由的 Controller /操作。 类似于:
[Route("~/test")]
public class ProductsController : Controller
{
[HttpGet("{id:int}")]
public IActionResult ById(int id)
{
...
}
}
在启动时我只是默认:
app.UseMvc(routeBuilder =>
{
routeBuilder.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
因此,应用程序正在按预期解析 /test/42
,但无法让 /products/byid?id=42
工作...如果我只需注释掉 Controller 中的属性即可执行默认路由。
有没有办法让他们一起工作?
最佳答案
简而言之:将其更改为 [Route("/products")]
并重试。
详细:
如果您将 RouteAttribute 应用于 Controller 或操作方法,则该 Controller /操作方法将仅响应该指定的路由。在您给出的特定示例中,只有当您浏览到 /~test/65
时,它才会执行。
如果您希望 Controller /操作方法默认使用名称,请尝试使用 [controller]
和 [action]
标志,如下所示:
[Route("[controller]")]
public class ProductsController : Controller
{
[HttpGet("[action]/{id:int}")] // /Products/ById/5
public IActionResult ById(int id)
{
...
}
}
如果没有 Controller 命中您指定的路由,则 ASP.NET Core 中的默认路由是 MVC 将回退到的路由。在这种情况下,/Products/ById/5
也可以工作。
默认情况下,它映射到 Home
Controller 和 Index
操作方法,这是您的默认主页。如果路由只是 /
那么该操作将被执行。
您也可以直接指定您想要的路线
[Route("/api/products")]
public class ProductsController : Controller
{
[HttpGet("by-id/{id:int}")] // /api/products/by-id/5
public IActionResult ById(int id)
{
...
}
}
你也可以尝试一下Joe尝试过的建议,因为这也是一种方法。但最后,您可以微调您的路线,并且如果您愿意,可以在一个 Controller 或操作上拥有多个路线。自己尝试和实验,但请查看文档以获取更多信息。
很可能,您不想修改默认路由,而是根据自己的喜好调整 RouteAttribute。了解 attribute routing和 routing to controller actions using app.UseMvc()在我提供的链接中。
关于c# - ASP.NET属性路由和默认路由可以一起工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174699/