c# - ASP.NET属性路由和默认路由可以一起工作吗?

标签 c# asp.net-core asp.net-core-mvc asp.net-core-routing

我有一个用 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 routingrouting to controller actions using app.UseMvc()在我提供的链接中。

关于c# - ASP.NET属性路由和默认路由可以一起工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174699/

相关文章:

c# - 如何使用 ASP.NET Core 从 DbContext 中的 JWT 获取用户名?

c# - 如何使用 WCF 从 Windows 服务通知应用程序

asp.net-mvc - Visual Studio 2015 异步变量未显示在调试器中

c# - 从Docker容器中的.NET Core App访问主机上的CSV文件

找不到Asp.net Core 2.0静态文件错误

razor - 在 View 中显示对象 ToString() 值

c# - 使用 linq 计算一列与条件的总和

c# - 动态 String.Format 取决于参数

asp.net-core - NavLink 更新 URL 但不会在 Blazor 中重新加载页面

c# - 将 ModelExpression 从 Tag Helper 传递到分部 View