【问题标题】:Proper way to return JSON list in Web API with MVC and partial model使用 MVC 和部分模型在 Web API 中返回 JSON 列表的正确方法
【发布时间】:2016-10-27 12:25:41
【问题描述】:

我正在尝试使用 Web API 从我的 MVC 控制器中获取某些字段。我似乎无法将正确的类型与正确的列表相匹配。我可以将所有内容都转换为字符串。

我得到一个代码错误(无法转换类型),或者如果我让它编译,我得到这个错误:

"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'."

从其他类似的帖子中,人们回复了如何创建列表,但没有声明 Get 的返回值。请同时包含两者。

此外,我不希望添加额外的控制器,因为我需要在我的许多模型上执行此操作。

这是我的代码——注意你可以看到我尝试了许多不同的方法:

public class APICLIENTsController : ApiController
{
    private ApplicationDbContext db = new ApplicationDbContext();

    // GET api/<controller>
    public IEnumerable<string> Get()
    //public IEnumerable<CLIENT> Get()
    {
        //return db.CLIENTs.OrderBy(x => x.CLIENTNAME).ToList();
            string[] listOfUsers = db.CLIENTs.OrderBy(x => x.CLIENTNAME).Select(r => new
            {
                ID = r.CLIENTID.ToString(),
                NAME = r.CLIENTNAME
        });

        return listOfUsers.ToList();
        //return db.CLIENTs.Select(x => new { x.CLIENTNAME }).ToArray();
    }

【问题讨论】:

  • 您的查询正在创建一个匿名对象的集合(具有 2 个属性 IDNAME)而不是 string 的数组
  • 那么我该如何解决?我从一个 iqueryable 模型开始,我不介意将它转换为我可以从这个 api 中提取的任何东西。
  • 不清楚你真正想要返回什么。如果要返回对象集合,请创建一个视图模型(例如 class Itemint IDstring Name)并使用 IEnumerable&lt;Item&gt; listOfUsers = db.CLIENTs.OrderBy)..).Select(r =&gt; new Item { ID = r.CLIENTID, Name = r,CLIENTNAME)}; return listOfUsers; 并创建方法 public IEnumerable&lt;Item&gt; Get()
  • 我有很多这样的 api 调用要进行,所以我不想创建 20 个视图模型。我只想用最简单的方法把它传给 Json。如果我可以在函数中做到这一点,我可以将所有内容都转换为字符串(但我不知道如何)。
  • 我看不出string[] 能如何帮助您。您如何使用这些数据?

标签: json asp.net-mvc asp.net-web-api2


【解决方案1】:

如果要返回 JSON,请使用

JsonResult

键入。

public JsonResult Get()
{
    //return db.CLIENTs.OrderBy(x => x.CLIENTNAME).ToList();
    string[] listOfUsers = db.CLIENTs.OrderBy(x => x.CLIENTNAME).Select(r => new
    {
        ID = r.CLIENTID.ToString(),
        NAME = r.CLIENTNAME
    });

    return Json(listOfUsers.ToList(), JsonRequestBehavior.AllowGet);    
} 

【讨论】:

  • 谢谢。这为我指明了正确的方向,但是...如果我执行 string[] listOfUsers..,我会收到错误:错误 CS0029 无法将类型'System.Linq.IQueryable>' 隐式转换为' string[]' 如果我将其更改为 var listOfUsers... 我收到错误:错误 CS0029 无法隐式转换类型 'System.Web.Http.Results.JsonResult >>' 到 'System.Web.Mvc.JsonResult'
  • 如何让这里的 Get 方法接受 fromBody 对象并通过 POST 请求使其工作?
【解决方案2】:

您的查询正在返回一组匿名对象 not string[],因此它会引发异常。即使您要通过连接CLIENTIDCLIENTNAME 属性来生成string[],这对客户端来说还是有点用处。

创建一个模型来表示返回视图所需的内容

public class ClientVM
{
    public int ID { get; set; }
    public string Name { get; set; }
}

并将您的方法修改为

public IEnumerable<ClientVM> Get()
{
    IEnumerable<ClientVM> model = db.CLIENTs.OrderBy(x => x.CLIENTNAME).Select(r => new ClientVM
    {
        ID = r.CLIENTID,
        Name = r.CLIENTNAME
    });
    return model;
}

旁注:根据您在客户端调用和使用它的方式,您可能需要更改 Content-Type 以专门返回 json(有关更多详细信息,请参阅 these answers

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2012-08-04
    • 2021-05-17
    • 2013-04-30
    • 2014-01-04
    • 1970-01-01
    • 2019-05-27
    • 2018-07-02
    • 2020-01-09
    相关资源
    最近更新 更多