如何使 IHttpActionResult 与 MVC 5 控制器交互



在经历了几个我不得不专注于其他技术的项目之后,我正在重新连接MVC。

我创建了一个包含 MVC 5 项目和 Web Api 2 项目的测试解决方案。

在 Web API 控制器上,我返回一个 Ok 结果,其中包含我从业务层获得的内容,如下所示:

public IHttpActionResult GetAllActivities()
{
    return Ok(activitiesBl.GetAllActivities());
}

MVC 控制器正在执行以下操作:

public ActionResult Index()
{
    var result = activitiesService.GetAllActivities();
    return View(result);
}

现在这不起作用,因为变量结果的类型是 IHttpActionResult 类型,这不是视图作为模型所期望的。为了获得该结果的内容,我需要执行以下操作:

var content = ((System.Web.Http.Results.OkNegotiatedContentResult<IEnumerable<Model.Activity>>)result).Content;  

这看起来很奇怪,在某些时候,Web API 控制器可能会出现它可能会返回另一个 IHttpActionResult 实例的情况,例如 NotFound 或其他东西,因此强制转换不起作用,我认为在 MVC 控制器中测试所有可能性不是一个好主意,因为这会耦合两个控制器,所有不是很 DRY 的操作都是这种情况。

所以问题是:

  1. 应该如何实现两种类型的控制器之间的交互?
  2. 我是否应该忘记从 Web API 操作返回 IHttpActionResult 并只返回预期的模型?
  3. 如果我无法返回 IHttpActionResult ,那会不会将 Web API 的使用限制在一个 MVC 项目中,而不是可供不同的客户端使用?
  1. 应该如何实现两种类型的控制器之间的交互?

不应该。让 MVC 控制器包装 API 控制器从根本上是有缺陷的。你正在弯曲你的设计,让它变得干燥,但这只会给你带来更多的痛苦。

如果要将数据同时公开为网页和 API,请让两个控制器调用业务层来检索模型(例如,activiesBl),然后以自己的方式构造视图。

最新更新