我是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]
标签的情况下,有什么方法可以做到这一点?
答案 0 :(得分:1)
如果您要使用asp.net内核构建api,请检查此内容。
您可以使用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
来创建更复杂的规则,但是如果您想保持简单并为每个端点指定路由,则可以使用HttpGet
或Route
属性进行操作。或者,如果要使其明确,则可以在每个HttpGet
中写出整个路由,而忽略控制器上的Route
属性。