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

时间:2015-03-09 21:05:44

标签: c# asp.net-mvc-5 asp.net-web-api2

在我不得不关注其他技术的长期项目之后,我正在重新与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控制器中的可能性,因为这将耦合两个控制器,并且所有不太干的动作都是如此。

所以问题是:

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

1 个答案:

答案 0 :(得分:0)

  
      
  1. 如何实现两种控制器之间的交互?
  2.   

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

如果您希望将数据公开为网页和API,则让两个控制器调用您的业务层来检索模型(例如,activiesBl),然后构建视图,每个视图都在自己的视图中方式。