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

DiP*_*Pix 5 c# asp.net-core

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

为什么我总是要返回ActionResult?这有什么区别吗:

public ActionResult<MyDTO> GetData(){
    return new MyDTO();
}
Run Code Online (Sandbox Code Playgroud)

然后:

public MyDTO GetData(){
    return new MyDTO();
}
Run Code Online (Sandbox Code Playgroud)

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

SO *_*ood 6

当你使用这个:

public MyDTO GetData(){
    return new MyDTO();
}
Run Code Online (Sandbox Code Playgroud)

MyDTO除了抛出异常之外,您不能返回任何不是 的实例。

当你用IActionResult<T>你说,你可能会返回的实例MyDTO,但你并不需要。您可以返回 BadRequest、InternalServerError 或任何适合 API/业务需求的内容。


Maj*_*uri 5

什么是ActionResult

ActionResult 是一个抽象类,表示操作方法的结果。该类本身继承自System.Object,仅添加了一个额外的抽象方法:ExecuteResult,这是 ActionResult 的派生类将自行实现的抽象方法。

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

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

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

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

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

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

参考1 参考2


ror*_*.ap 0

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

如果您不需要所有这些,那么返回您的对象就可以了。