ResultToActionResult Extensions (MVC Support β€” v1.21.0)

Setup β€” required once per assembly:

// Any .cs file β€” typically Program.cs or AssemblyInfo.cs
[assembly: GenerateActionResultExtensions]
Without this attribute the source generator does not emit 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 }