gpt4 book ai didi

c# - 整个 Controller 类中可用的 ASP.NET Core 路由属性

转载 作者:行者123 更新时间:2023-11-30 22:55:35 25 4
gpt4 key购买 nike

有没有办法让路由中指定的属性在整个类中可用?例如,考虑这个 Controller :

[Route("api/store/{storeId}/[controller]")]
public class BookController
{
[HttpGet("{id:int:min(1)}")]
public async Task<IActionResult> GetBookById(int storeId, int id)
{
}
}

这个请求:

/api/store/4/book/1

在 GetBookById 方法中,storeId 变量正确填充为 4,id 变量正确填充为 1。但是,不必在 BookController 的每个方法中传递 storeId 变量,有没有一种方法可以执行以下操作:

[Route("api/store/{storeId}/[controller]")]
public class BookController
{
private int storeId;

[HttpGet("{id:int:min(1)}")]
public async Task<IActionResult> GetBookById(int id)
{
//use value of storeId here
}
}

最佳答案

如果 Controller 继承自Controller类那么你可以覆盖OnActionExecuting方法,如果 Controller 继承自ControllerBase你需要实现IActionFilter 接口(interface)使其工作

[Route("api/store/{storeId}/[controller]")]
public class BookController : ControllerBase, IActionFilter
{
private int storeId;

[HttpGet("{id:int:min(1)}")]
public async Task<IActionResult> GetBookById(int id)
{
// use value of storeId here
}

public void OnActionExecuted(ActionExecutedContext context)
{
//empty
}

public void OnActionExecuting(ActionExecutingContext context)
{
string value = context.RouteData.Values["storeId"].ToString();
int.TryParse(value, out storeId);
}
}

或者有一个更好的解决方案,使用 Controller 属性上的 [FromRoute] 属性(如描述 here )

[Route("api/store/{storeId}/[controller]")]
public class BookController : ControllerBase
{
[FromRoute(Name = "storeId")]
public int StoreId { get; set; }

[HttpGet("{id:int:min(1)}")]
public async Task<IActionResult> GetBookById(int id)
{
// use value of storeId here
}
}

关于c# - 整个 Controller 类中可用的 ASP.NET Core 路由属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55179643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com