ResultToActionResult Extensions (MVC Support β v1.21.0)
Setup β required once per assembly:
Without this attribute the source generator does not emit// Any .cs file β typically Program.cs or AssemblyInfo.cs [assembly: GenerateActionResultExtensions]ToActionResult()/ToPostActionResult()/ etc. for this assembly.
Convention-based HTTP mapping for ASP.NET MVC Controllers
// Convention-based β domain errors auto-map to correct HTTP status codes
[HttpGet]
public async Task<IActionResult> GetAll()
=> (await _service.GetAllUsersAsync()).ToActionResult();
[HttpPost]
public async Task<IActionResult> Create([FromBody] CreateUserRequest request)
=> (await _service.CreateUserAsync(request)).ToPostActionResult();
[HttpDelete("{id:int}")]
public async Task<IActionResult> Delete(int id)
=> (await _service.DeleteUserAsync(id)).ToDeleteActionResult();
// NotFoundError β 404, ConflictError β 409, success β 204
// Explicit overload β escape hatch for full control
[HttpGet("{id:int}")]
public async Task<IActionResult> GetById(int id)
{
return (await _service.GetUserAsync(id))
.ToActionResult(
onSuccess: user => Ok(user),
onFailure: errors => NotFound(errors.First().Message));
}
| Method | Success | Failure |
|---|---|---|
ToActionResult<T>() |
OkObjectResult (200) |
Auto-mapped via HttpStatusCode tag |
ToActionResult<T>(onSuccess, onFailure) |
Custom | Custom |
ToPostActionResult<T>() |
CreatedResult (201) |
Auto-mapped |
ToPutActionResult<T>() |
OkObjectResult (200) |
Auto-mapped |
ToPatchActionResult<T>() |
OkObjectResult (200) |
Auto-mapped |
ToDeleteActionResult<T>() |
NoContentResult (204) |
Auto-mapped |
MVC Error Auto-Mapping (MapErrorToActionResult)
| Domain Error | HTTP | MVC Result Type |
|---|---|---|
NotFoundError |
404 | NotFoundObjectResult |
UnauthorizedError |
401 | UnauthorizedResult |
ForbiddenError |
403 | ForbidResult |
ConflictError |
409 | ConflictObjectResult |
ValidationError |
422 | ObjectResult { StatusCode = 422 } |
| No tag / other | 400 | ObjectResult { StatusCode = 400 } |