【问题标题】:Get a Value from ActionResult<object> in a ASP.Net Core API Method从 ASP.Net Core API 方法中的 ActionResult<object> 获取值
【发布时间】:2020-08-10 17:01:30
【问题描述】:

我尝试在 ASP.NET Core API 方法中从 ActionResult&lt;object&gt; 获取值。

API 有不同的控制器。我尝试在控制器 A 中使用来自控制器 B 的方法来返回结果值。我从控制器 B 获得了一个 ActionResult 对象。我可以在 ResultObject 中使用调试器查看该值,但我如何才能访问其中的结果值?

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
}

【问题讨论】:

标签: c# asp.net-core asp.net-core-webapi actionresult


【解决方案1】:
假设您在Repository.cs 中有示例函数:
public async Task<IEnumerable<Todo>> GetTodosAsync() =>
   await _context.Todos.ToListAsync();
Controller.cs 中的函数如下所示:
public async Task<ActionResult<IEnumerable<Todo>>> GetTodosAsync() =>
    Ok(await _repository.GetTodosAsync());
然后在您的UnitTest.cs 中,您可以通过以下方式获得结果:
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

【讨论】:

  • 被低估的评论!
【解决方案2】:

如果您从操作中调用 API,并且 API 返回您想要在操作中访问的 Ok(result),那么下面的代码可以帮助您:

if (response.StatusCode == System.Net.HttpStatusCode.OK)
{                                   
    return Ok(response.Content); // returns API result
}

【讨论】:

    【解决方案3】:

    如果您确定它是 OkObjectResult 的类型,请在使用之前进行转换,如下所示:

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

    【讨论】:

    • 当我们有 4 种不同的类型而不是 OkObjectResult 时如何处理这个问题,我们可以不进行强制转换吗?
    • 你也可以只转换为ObjectResult,仍然得到Value,它可以处理多种结果类型,例如OkObjectResultUnauthorizedObjectResult等。
    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 2021-01-05
    • 2018-03-30
    • 1970-01-01
    • 2019-06-23
    • 2016-11-25
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多