33

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

1

3 Answers 3

35

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.
Sign up to request clarification or add additional context in comments.

3 Comments

How to handle this when instead of OkObjectResult, we have 4 different types, can we do this without cast?
You can also just cast to ObjectResult and still get Value, which can handle multiple result types, eg OkObjectResult, UnauthorizedObjectResult, etc.
In my case I had to cast it to JsonResult to get it to work.
26
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

1 Comment

Underrated comment!
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
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.