c# - NET CORE MVC - 如何使用嵌套的多参数化路由

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

寻找在 .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 方法中包含验证逻辑更好的方法。

  • 有没有办法在不同的 Controller 上级联多个 Action 方法?以便首先调用 CampusController 上的验证方法,然后调用 BuildingController 上的方法?
  • 有没有办法对 campusId 进行 Controller 级别的验证,如果验证失败,它可能会短路并返回 ActionResult?

编辑:当我提到验证逻辑时,我指的是 API 信号;不是实际确定 campusId 是否有效的业务逻辑。

提前致谢!

最佳答案

如果在路由前缀中使用占位符,您还需要将其包含在操作本身中

[Route("api/campus/{campusId:int}/building")]
public class BuildingController : Controller {
    //...

    [HttpGet]
    [Route("{buildingId:int}")] // Matches GET api/campus/123/building/456
    public IActionResult GetBuilding ([FromRoute]int campusId, [FromRoute]int buildingId) { 
        //... validate campus id along with building id 
    }    
}

如果担心验证的重复代码,请为校园相关请求创建一个基本 Controller ,并使用共享的验证方法。

另一种选择是拥有一个服务/存储库,可用于验证校园 ID 及其与所提供建筑物 ID 的关系(如果需要)。

关于c# - NET CORE MVC - 如何使用嵌套的多参数化路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45448461/

相关文章:

c# - 如何在 .NET Core 代码的单元测试中提供 ILogger<T>?

c# - 未触发DataGrid上复选框的未选中事件

c# - 使用事件来集中信息

c# - 当提交按钮的 POST 时,asp.net core mvc dropdownlist 设置为 null

c# - 使用 Azure Active Directory 对用户进行身份验证后执行代码

c# - Serilog + ElasticSearch Sink 连接问题(.net core)

c# - 如何解决 .net 核心构建错误 NETDSDK1061 和警告 MSB3277

C# 获取具有特定且完全匹配扩展名的文件

c# - 在两个 ASP.NET Core 应用程序之间共享 Cookie

c# - 使用 Controller 类以外的类进行依赖注入(inject)