【发布时间】:2016-10-26 04:21:32
【问题描述】:
使用IActionResult 作为 WebApi 控制器的返回类型而不是您想要返回的实际类型有什么好处或建议?
我看到的大多数示例都返回 IActionResult,但是当我构建我的第一个站点时,我专门使用 View Model 类作为我的返回类型......现在我觉得我做错了!
【问题讨论】:
标签: asp.net-core asp.net-core-mvc
使用IActionResult 作为 WebApi 控制器的返回类型而不是您想要返回的实际类型有什么好处或建议?
我看到的大多数示例都返回 IActionResult,但是当我构建我的第一个站点时,我专门使用 View Model 类作为我的返回类型......现在我觉得我做错了!
【问题讨论】:
标签: asp.net-core asp.net-core-mvc
主要优点是您可以返回错误/状态代码或重定向/资源 URL。
例如:
public IActionResult Get(integer id)
{
var user = db.Users.Where(u => u.UserId = id).FirstOrDefault();
if(user == null)
{
// Returns HttpCode 404
return NotFound();
}
// returns HttpCode 200
return ObjectOk(user);
}
或
public IActionResult Create(User user)
{
if(!ModelState.IsValid)
{
// returns HttpCode 400
return BadRequest(ModelState);
}
db.Users.Add(user);
db.SaveChanges();
// returns HttpCode 201
return CreatedAtActionResult("User", "Get", new { id = user.Id} );
}
【讨论】:
IActionResult 能得到什么,而ActionResult 不能得到,ActionResult 在某种程度上限制了我们吗?互联网上的其他答案并不那么引人注目。
IActionResult 是一个接口,ActionResult 是一个抽象类。虽然 MVC 中的所有 ActionResults 都继承自 ActionResult,但不能给出或保证某些 3rd 方操作结果类会这样做,因此最好使用尽可能低的类型,这里:IActionResult
IActionResult' is an interface and doesn't have the synchronous version of ExecuteResult` 方法而不是ActionResult,从消费者的角度来看,我没有发现任何不同,我认为这可能更像是一个框架设计决策我们这个框架的消费者不应该太在意。
IActionResult返回BadRequest和CreatedAtActionResult,这使得IActionResult看起来没有优势然后根据你的例子。
IActionResult vs 返回T
主要优点是您可以使用模拟框架轻松测试您的代码。
在构建控制器时,您也可以轻松更改返回对象。 IActionResult 是一个接口,有很多实现,如 JsonResult、ViewResult、FileResult 等。
【讨论】: