将 Location URI 指向另一个控制器
Set Location URI point to another controller
我有一个带有动作的控制器,我想将 LocationUri
设置为指向另一个控制器。例如,我有:
[Route("auth")]
[ApiController]
public class AuthorisationController
{
[Route("{id}")]
public IActionResult Put([FromRoute]string id, [FromBody]FooBar request)
{
return new CreatedResult("locationUri", SanitiseResponse(request));
}
}
我希望 LocationUri
指向这个控制器
[Route("transaction")]
[ApiController]
public class TransactionController
{
[Route("{id}")]
public IActionResult Get([FromRoute] string id)
{
return new OkResult();
}
}
知道我该怎么做吗?我正在使用 _httpContextAccessor
自己构建它,但想知道是否有更好的方法?
这是派生自 ControllerBase
的地方,因为它提供了一个帮助成员来简化您要实现的目标
[Route("auth")]
[ApiController]
public class AuthorisationController : ControllerBase {
[Route("{id}")]
public IActionResult Put([FromRoute]string id, [FromBody]FooBar request) {
return CreatedAtAction("Get", "Transaction", { id = ??? }, SanitiseResponse(request));
}
}
引用ControllerBase.CreatedAtAction Method
您仍然可以使用 CreatedAtActionResult
自己完成
[Route("auth")]
[ApiController]
public class AuthorisationController {
[Route("{id}")]
public IActionResult Put([FromRoute]string id, [FromBody]FooBar request) {
return new CreatedAtActionResult("Get", "Transaction", { id = ??? }, SanitiseResponse(request));
}
}
这基本上就是辅助方法包装的内容。
请注意示例中的 ???
,您将在其中指定 id
routeValue,在本例中,它是生成的 URI[=18= 的一部分]
为避免对操作和控制器进行硬编码,您可以执行以下操作,但我发现它相当冗长。
//...
string actionName = nameof(TransactionController.Get);
string controllerName = nameof(TransactionController).TrimEnd("Controller");
return CreatedAtAction(actionName, controllerName, { id = ??? }, SanitiseResponse(request));
//...
如果重构控制器名称或操作名称,这将允许 IDE 自动进行更改或显示语法错误,提醒您更改。
我有一个带有动作的控制器,我想将 LocationUri
设置为指向另一个控制器。例如,我有:
[Route("auth")]
[ApiController]
public class AuthorisationController
{
[Route("{id}")]
public IActionResult Put([FromRoute]string id, [FromBody]FooBar request)
{
return new CreatedResult("locationUri", SanitiseResponse(request));
}
}
我希望 LocationUri
指向这个控制器
[Route("transaction")]
[ApiController]
public class TransactionController
{
[Route("{id}")]
public IActionResult Get([FromRoute] string id)
{
return new OkResult();
}
}
知道我该怎么做吗?我正在使用 _httpContextAccessor
自己构建它,但想知道是否有更好的方法?
这是派生自 ControllerBase
的地方,因为它提供了一个帮助成员来简化您要实现的目标
[Route("auth")]
[ApiController]
public class AuthorisationController : ControllerBase {
[Route("{id}")]
public IActionResult Put([FromRoute]string id, [FromBody]FooBar request) {
return CreatedAtAction("Get", "Transaction", { id = ??? }, SanitiseResponse(request));
}
}
引用ControllerBase.CreatedAtAction Method
您仍然可以使用 CreatedAtActionResult
[Route("auth")]
[ApiController]
public class AuthorisationController {
[Route("{id}")]
public IActionResult Put([FromRoute]string id, [FromBody]FooBar request) {
return new CreatedAtActionResult("Get", "Transaction", { id = ??? }, SanitiseResponse(request));
}
}
这基本上就是辅助方法包装的内容。
请注意示例中的 ???
,您将在其中指定 id
routeValue,在本例中,它是生成的 URI[=18= 的一部分]
为避免对操作和控制器进行硬编码,您可以执行以下操作,但我发现它相当冗长。
//...
string actionName = nameof(TransactionController.Get);
string controllerName = nameof(TransactionController).TrimEnd("Controller");
return CreatedAtAction(actionName, controllerName, { id = ??? }, SanitiseResponse(request));
//...
如果重构控制器名称或操作名称,这将允许 IDE 自动进行更改或显示语法错误,提醒您更改。