28

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

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Localbug
  • 313
  • 1
  • 3
  • 7
  • 1
    Does this answer your question? [How to Unit Test with ActionResult?](https://stackoverflow.com/questions/51489111/how-to-unit-test-with-actionresultt) – Michael Freidgeim Aug 09 '20 at 22:38

3 Answers3

29

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.
CodeNotFound
  • 22,153
  • 10
  • 68
  • 69
  • 1
    How to handle this when instead of `OkObjectResult`, we have 4 different types, can we do this without cast? – dragos Sep 16 '20 at 08:09
  • 9
    You can also just cast to `ObjectResult` and still get `Value`, which can handle multiple result types, eg `OkObjectResult`, `UnauthorizedObjectResult`, etc. – Rokit Sep 23 '20 at 19:41
20
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
mikolaj semeniuk
  • 2,030
  • 15
  • 31
0

If you are calling an API from action and the API returns Ok(result) which you want to access in your action then below code can help you:

if (response.StatusCode == System.Net.HttpStatusCode.OK)
{                                   
    return Ok(response.Content); // returns API result
}
Rohil Patel
  • 386
  • 3
  • 8