为什么我应该返回ActionResult而不是object?

时间:2018-11-12 12:18:32

标签: c# asp.net-core

假设我具有应用程序.net Core 2.1 Web API + Angular 7

为什么我总是要返回ActionResult? 两者之间有什么区别吗?

public ActionResult<MyDTO> GetData(){
    return new MyDTO();
}

那:

public MyDTO GetData(){
    return new MyDTO();
}

在两种情况下,我都将在UI上接收对象,并且都返回代码200。那么使用ActionResult还是一种好的做法?

5 个答案:

答案 0 :(得分:1)

使用此功能时:

public MyDTO GetData(){
    return new MyDTO();
}

除了引发异常之外,您不能返回任何不是MyDTO实例的东西。

使用IActionResult<T>时表示您可能返回MyDTO的实例,但您不必。您可以返回BadRequest,InternalServerError或任何适合API /业务需求的内容。

答案 1 :(得分:1)

基本上,当您返回对象时,您的代码必定会交付该对象。

在您的情况下,一切都很好,并且返回MyDTOhttp 200

但是让我们考虑一下这种情况:

public MyDTO GetData(){

    if (someValidationFailed)
    {
        //bad request, not authorized, forbidden etc.
        return BadRequest();
    }

    return new MyDTO();
}

那不会加起来。因此,总的来说:返回IActionResult会给您带来更大的灵活性。

答案 2 :(得分:1)

什么是ActionResult

ActionResult 是一个 抽象 类,表示操作方法的结果。类本身继承自System.Object,只增加了一个抽象方法:ExecuteResult,这是ActionResult的派生类将自己实现的抽象方法。 >

为什么 ActionResult 是抽象类?这样不同的控制器动作可以返回不同类型的结果,并且仍然让 MVC 正确处理它们。

你可能已经猜到了这个实现是因为 ActionResult 有很多派生类,你是完全正确的。但这些不同类型的结果究竟是什么?它们分为三个部分:内容返回重定向状态结果,我们将依次查看每一种.

当一个操作中可能有多个 ActionResult 返回类型时,IActionResult 返回类型是合适的。

ActionResult 类型代表各种HTTP 状态代码。从 ActionResult 派生的任何非抽象类都有资格作为有效的返回类型。

此类别中的一些常见返回类型是 BadRequestResult (400)、NotFoundResult (404) 和 OkObjectResult (200)。

或者,ControllerBase 类中的常规方法可用于从操作返回 ActionResult 类型。

Reference1 Reference2

答案 3 :(得分:0)

这取决于您需要应用程序执行的操作。 ActionResultthe IActionResult interface的默认实现,它具有ExecuteResultAsync(ActionContext)方法。因此,如果您想在给定的上下文中异步执行结果,那么您想使用它而不是像他们所说的那样重新发明轮子。

如果不需要所有这些,则返回对象,就可以了。

答案 4 :(得分:0)

使用ActionResult而不是对象,您可以针对不同的情况(错误,重定向..)返回不同的响应类型

返回对象而不是ActionResult总是返回200响应(假定未引发异常)

有关结果和返回结果的方法的完整列表,请检查:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase?view=aspnetcore-2.1