如何为ApiControllers返回多个对象类型

时间:2012-05-24 14:37:38

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-web-api

我已将项目升级为使用MVC3中的ASP.NET MVC4。现在我的控制器正在使用ApiController而不是Controllers。以前我使用的函数是:

 public JsonResult GetPermissions(string portfolioId)
 {
     //DO THE DATA FETCH
     return Json(new { PermissionValues = permissionValues,       UserPermissions = userPermissions, OwnerValues = ownerList },JsonRequestBehavior.AllowGet);
 } 

我想使用ApiControllers进行类似的操作。我不想创建一个单独的对象,其中对象将具有3个属性[因为我返回3个列表]。我试图使用HttpResponseMessage<Object>作为函数的返回类型,但似乎不起作用。

    public HttpResponseMessage<Object> GetPermissions(string portfolioId)
    {
      //DO THE DATA FETCH
      HttpResponseMessage<Object> response = new HttpResponseMessage<Object>(new { Users = listedUsers, PermissionValues = permissionValues });
      return response;
    }

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您遇到的主要问题是Beta位中json响应的默认序列化程序无法序列化匿名类型。您需要使用可以使用的格式化程序,例如基于Json.NET的格式化程序(将在下一个内置中内置)。要使这与Beta一起使用,您的代码将更改为以下内容:

public HttpResponseMessage Get()
{
    var content = new { Users = new List<string> { "John", "Mary" }, Permissions = new List<string> { "User", "Admin" } };
    return new HttpResponseMessage<object>(content, new[] { new JsonNetFormatter() });
}

哪会产生这样的回应:

{"Users":["John","Mary"],"Permissions":["User","Admin"]}

RC可用后,您现有的代码应该可以正常工作。

更新

为了编译此代码,您需要JsonNetFormatter的实现。您可以在http://code.msdn.microsoft.com/Using-JSONNET-with-ASPNET-b2423706#contenthttps://github.com/WebApiContrib/WebAPIContrib/blob/master/src/WebApiContrib.Formatting.JsonNet/JsonNetFormatter.cs的WebApiContrib项目中找到Henrik(MSFT)提供的实现。

注意,它们都在OnWriteToStreamAsync方法中遇到相同的错误。这些实现关闭了底层流。您需要将using语句更改为:

using (var jsonTextWriter = new JsonTextWriter(new StreamWriter(stream, Encoding)) { CloseOutput = false })
Henrik在他的博客中注意到这一点,但他的样本和贡献者都没有更新,我只是没有时间将修复提交给contrib项目。 ;)