【问题标题】:Return JSON data from WebAPI Controller从 WebAPI 控制器返回 JSON 数据
【发布时间】:2012-07-13 04:30:19
【问题描述】:

我想从我的 WebAPI 控制器返回一些 JSON 数据,我希望返回的数据是这样的。

{"rows":[{"id":1,"cell":["1","amila","amila","False"]},{"id":2,"cell":["2","rakhitha","rakhitha","False"]},{"id":3,"cell":["3","Chathura","Chathura","False"]},{"id":4,"cell":["4","Geethaga","Geethaga","False"]}]}

但是当我使用下面的代码时,

return new System.Web.Mvc.JsonResult()
        {
            Data = jsonData,
            JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.AllowGet
        };

数据是这样返回的。

{"Data":{"rows":[{"id":1,"cell":["1","amila","amila","False"]},{"id":2,"cell":["2","rakhitha","rakhitha","False"]},{"id":3,"cell":["3","Chathura","Chathura","False"]},{"id":4,"cell":["4","Geethaga","Geethaga","False"]}]},"JsonRequestBehavior":0}

还有一个额外的 JSON 键作为“数据”。我不想要那个参数,作为我的实现,我不能在把它送到客户端后删除这个“数据”部分。因为从服务器接收到的数据直接用来填充一个jqGrid。代码如下。

$("#Grid1").jqGrid({
            url: 'api/matchingservicewebapi/GetUser',
            datatype: 'json',
            mtype: 'GET',
            colNames: ['', 'Name', 'FullName', 'IsActive'],
            colModel: [
                { name: 'Id', index: 'Id', width: 200 },
                { name: 'Name', index: 'Name', width: 300 },
                { name: 'FullName', index: 'FullName', width: 300 },
                { name: 'IsActive', index: 'IsActive', width: 300 }
            ],
            rowNum: 10,
            rowList: [10, 20, 30],
            pager: '#pager',
            sortname: 'Id',
            viewrecoreds: true,
            sortorder: "desc",
            imgpath: 'Themes/images'
    }).navGrid(pager, { edit: true, add: true, del: true, refresh: true, search: true });

如何删除这个“数据”部分?因为当您在返回的 JSON 中有这个“数据”键时,jqGrid 无法将该数据填充到网格中。

我正在使用 WebAPI 控制器来返回此数据。但是我尝试使用 MVC3 控制器,然后这个“数据”键不在返回的 JSON 中,并且数据成功填充到网格中。但我想使用 WebAPI 控制器。请帮忙解决这个问题。

提前谢谢你。

【问题讨论】:

    标签: asp.net json jqgrid asp.net-web-api


    【解决方案1】:

    JsonResult 是一个 MVC 概念。对于 Web API,您的控制器可以简单地返回一个 CLR 对象,并将其序列化为 JSON(假设客户端请求 JSON)。

    您看到的结果是因为整个 JsonResult 对象正在序列化为 JSON。

    要开始使用 Web API,请参阅:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

    (或者您可以继续使用 MVC 控制器……您想使用 Web API 控制器有什么特殊原因吗?)

    【讨论】:

    • 非常感谢您的解释
    【解决方案2】:

    Json.NET 很适合我。只需在 Web API 中返回 JObject

    http://james.newtonking.com/projects/json/help/html/CreatingLINQtoJSON.htm

    JObject o = JObject.FromObject(new
    {
      channel = new
     {
       title = "James Newton-King",
       link = "http://james.newtonking.com",
       description = "James Newton-King's blog.",
       item =
           from p in posts
           orderby p.Title
           select new
           {
             title = p.Title,
             description = p.Description,
             link = p.Link,
             category = p.Categories
        }
    

    } })

    【讨论】:

      【解决方案3】:

      在 jqGrid 中设置 jsonreader 选项。喜欢

      jQuery("#gridid").jqGrid({
      ...
         jsonReader : {root:"Data"},
      ...
      });
      

      http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_string

      【讨论】:

      • 非常感谢。这个对我有用。但是有没有办法定义我是否没有根元素。我的意思是,jsonReader : {root:""}
      【解决方案4】:

      使用data.d 代替代码中的数据。

       success: function(data){
                     //create jquery object from the response html
                     var response=$(data.d);
                     //Your binding logic here
                }
      

      【讨论】:

        【解决方案5】:

        您可以返回 jqgrid 所需格式的数据。如果您不想为此创建单独的类,请在 apicontroller 中使用动态返回类型。请参阅工作示例 here。

        【讨论】:

          猜你喜欢
          • 2011-01-20
          • 2019-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多