【发布时间】:2017-08-01 22:10:41
【问题描述】:
寻找在 .NET Core MVC 中使用嵌套路由时的最佳实践。
假设CampusController.cs 使用基本模型:
[Route("api/campus/")]
public class CampusController : Controller
{
...
[HttpGet]
[Route("{campusId}")]
public IActionResult GetCampusInfo ([FromQuery]int campusId) { ... }
}
而BuildingController.cs 与子模型一起使用:
[Route("api/campus/{campusId}/building")]
public class BuildingController : Controller
{
...
[HttpGet]
[Route("{buildingId}")]
public IActionResult GetBuilding ([FromQuery]int buildingId) { ... }
[Route("{buildingId}/")]
public IActionResult GetBuilding ([FromQuery]int buildingId) { ... }
....
(more Action Methods)
}
如果buildingId 直接映射到它可以检索的数据库,即使提供的campusId 不是父级。为了在调用 /api/campus/{campusId}/building/{buildingId} 时保持 URL 干净,我想验证 {campusId} 并返回一个 4xx 编码的 IActionResult(如果它无效)。必须有比在BuildingController 内的每个操作方法中包含验证逻辑更好的方法。
- 有没有办法在不同的控制器上级联多个 Action 方法?这样
CampusController上的验证方法会先被调用,然后再调用BuildingController上的方法? - 有没有办法对
campusId进行控制器级别的验证,如果验证失败,它可能会短路并返回 ActionResult?
编辑:当我提到验证逻辑时,我指的是 API 信号;不是实际确定 CampusId 是否有效的业务逻辑。
提前致谢!
【问题讨论】:
-
您还可以为整个控制器类创建一个自定义过滤器属性,如
[Authorize],以通过使用数据库、路由值、查询参数、登录用户等来验证每个 HTTP 请求。
标签: c# asp.net-core-mvc .net-core asp.net-core-routing