Get a Value from ActionResult<object> in a ASP.Net Core API Method

16,043

Solution 1

If you're sure that it is a type of OkObjectResult then cast before using it like below:

var result3 = (OkObjectResult)result.Result; // <-- Cast is before using it.
var result4 = result3.Value; //<-- Then you'll get no error here.

Solution 2

Suppose you have example function in Repository.cs:
public async Task<IEnumerable<Todo>> GetTodosAsync() =>
   await _context.Todos.ToListAsync();
And function in Controller.cs looks like below:
public async Task<ActionResult<IEnumerable<Todo>>> GetTodosAsync() =>
    Ok(await _repository.GetTodosAsync());
Then in your UnitTest.cs you can get results by doing this:
var result = await controller.GetTodosAsync();
// list of todos is in `actual` variable
var actual = (result.Result as OkObjectResult).Value as IEnumerable<Todo>;
// or use `ObjectResult` instead of `OkObjectResult` for multiple types
Share:
16,043
Localbug
Author by

Localbug

solution architect

Updated on June 29, 2022

Comments

  • Localbug
    Localbug almost 2 years

    I try to get a value from ActionResult<object> in an ASP.NET Core API method.

    The API has a different controller. I try to use a method from controller B in controller A to return the result value. I get an ActionResult object from controller B. I can see the value with the debugger in the ResultObject but how can I get access to the result value in it?

    public ActionResult<object> getSourceRowCounter(string sourcePath) //Method from Controller A
    {
        var result = ControllerB.GetValue($"{sourcePath}.{rowCounterVariableName}");  
        var result2 = result.Value; //null
        var result3 = result.Result; //typ: {Microsoft.AspNetCore.Mvc.OkObjectResult} <-see Value=4 in it with Debugger
        //var result4 = result3.Value; //Error?!
        //var result5 = result3.Content; //Error?!
        //var result6 = result3.?????; //How can i get the Value = 4?
        return Ok(result); //should only return value 4 and not the whole object
    }
    

    enter image description here

  • dragos
    dragos over 3 years
    How to handle this when instead of OkObjectResult, we have 4 different types, can we do this without cast?
  • Rokit
    Rokit over 3 years
    You can also just cast to ObjectResult and still get Value, which can handle multiple result types, eg OkObjectResult, UnauthorizedObjectResult, etc.
  • Kris
    Kris over 2 years
    Underrated comment!