![](/img/trans.png)
[英]How is ASP.NET Core able to convert any type to ActionResult<T> return type of controller actions?
[英]Convert ASP.NET Core ActionResult<T> object to another type in a filter
我有一个通用的Result<T>
类型,我在我的业务级服务中使用它来返回结果。 此类型包括具有实际值的属性 ( public T Value {get;}
) 以及指示 Success、NotFound、ValidationError 或其他选项的状态属性。
在 API 控制器中,我可以评估服务调用的结果并返回适当的 ActionResult ,例如NotFound
或Ok
或BadRequest
。
我可以在方法中手动做我想做的事
public ActionResult<Result<Customer>> GetCustomer(int id)
{
Result<Customer> result = _someService.GetGetCustomer(id);
if (result.Status == ResultStatus.NotFound) return NotFound();
if (result.Status == ResultStatus.Invalid)
{
foreach (var error in result.ValidationErrors)
{
ModelState.AddModelError(error.Key, error.Value);
}
return BadRequest(ModelState);
}
return Ok(result.Value);
}
但我希望能够在 ActionFilter 中执行此操作。
问题是我在弄清楚如何转换值方面没有取得太大成功,因为我希望过滤器适用于任何类型的T
。 一些伪代码可能有帮助:
[TranslateResultToHttp]
public ActionResult<Result<Customer>> GetCustomer(int id)
{
Result<Customer> result = _someService.GetCustomer(int id);
return Ok(result);
}
在我的TranslateResultToHttpAttribute
我需要获取结果结果,查看它的值,如果真的没问题,我会将Result<Customer>
替换为Customer
。 但如果它是 NotFound,我会返回 NotFound 等。
问题是过滤器不知道Result<T>
可能是什么 T,所以我很难解压结果以获取其值等。
假设您的Result<T>
类型具有包含纯状态的非通用基接口,您可以直接返回结果,获得隐式对象结果。 然后你可以实现一个结果过滤器来更新状态代码:
public interface IResult
{
int Result { get; set; } // could of course be something else
}
public class UpdateResultFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{ }
public void OnResultExecuted(ResultExecutedContext context)
{
if (context.Result is ObjectResult objectResult && objectResult.Value is IResult result)
{
// update status on object result
objectResult.StatusCode = result.Status;
}
}
}
最后,这与返回NotFoundResult
或BadRequestResult
等特定结果相同,因为这些只是带有预定义状态代码的StatusCodeResult
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.