ASP.net嵌套带有Route标签的路由

时间:2019-06-25 14:45:23

标签: c# asp.net

我是C#和ASP.Net的新手

我正在尝试对一些端点建模:

/api/sites/
/api/sites/{id}/
/api/sites/{id}/readers/
/api/sites/{id}/readers/{id}/

我已经有一个SitesController

[Route("api/[controller]")]
[ApiController]
public class SitesController : ControllerBase {
    [HttpGet("{id:length(24)}")]
    public ActionResult<Site> Get(string id) {}



}

我尝试在ReadersController类中添加SitesController

[Route("{id:length(24)}/[controller]}")]
[ApiController]
public class ReadersController {
    [HttpGet]
    public string Get() => "test";
}

尽管我无法打到端点/api/sites/{id}/readers/,所以我不确定自己是否正确。在仍然使用[Route]标签的情况下,有什么方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

如果您要使用asp.net内核构建api,请检查此内容。

Link

您可以使用routes.MapRoute个函数。 这样。

routes.MapRoute(
    name: "default_route",
    template: "{controller}/{action}/{id?}");

routes.MapRoute(
    name: "default_route",
    template: "{controller}/{action}/{id}/readers/{id?}");

答案 1 :(得分:1)

您不应该嵌套控制器类。为ReadersController创建新的课程,然后设置如下路线:

[Route("api/[controller]")]
[ApiController]
public class SitesController : ControllerBase {
    [HttpGet("{siteId:length(24)}")]
    public ActionResult<Site> Get(string siteId) {}
}

[Route("api/sites/{siteId:length(24)}/[controller]")]
[ApiController]
public class ReadersController {
    [HttpGet]
    public string Get() => "test";

    [HttpGet("{readerId:length(24)}")]
    public ActionResult<Site> Get(string siteId, string readerId) {}
}

您可以使用routes.MapRoute来创建更复杂的规则,但是如果您想保持简单并为每个端点指定路由,则可以使用HttpGetRoute属性进行操作。或者,如果要使其明确,则可以在每个HttpGet中写出整个路由,而忽略控制器上的Route属性。

相关问题