带有Web Service的jqGrid无法使用jsonreader格式

时间:2012-06-30 19:27:20

标签: jquery-ui jquery jqgrid-formatter

我想要做的是,我有一个Web服务,以json格式返回产品数量(来自示例Northwind数据库),我想将返回的行绑定到我的jqGrid。我试过JQGrid - Cannot call ASP.NET WebMethod but can with Ajax 但它对我的网络服务不起作用。

然后只是为了一个试验,我在同一个aspx页面上写了[Web方法]我正在创建jqGrid然后它确实适用于mtype:“POST”。以下是我的代码。

没有Web服务的工作代码

ASPX中的代码:

<script language="javascript" type="text/javascript">
        $(function () {
            jQuery("#jqGridXML").jqGrid({
                url: "jqGridXML.aspx/GetProducts",
                mtype: "POST",
                ajaxGridOptions: { contentType: "application/json; charset=utf-8" },
                datatype: "json",
                serializeGridData: function (postData) {
                    return JSON.stringify(postData);
                },
                jsonReader: {
                root: function (obj) { return obj.d;},
                page:function (obj) {return 1;},
                total: function (obj) {return 1;},
                records:function (obj) { return obj.d.length;},
                id:"0",
                cell:"",
                repeatitems:false
            },
            datatype:"json",
            height:250,
            colName:['ProductId','ProductName','UnitsInStock'],
            colModel:[{name:'ProductId',index:'ProductId',width:100},
            {name:'ProductName',width:100},
            {name:'UnitsInStock',width:100}],
            caption:"Products"
        });
    });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <table id="jqGridXML"></table>
    <div id="pagerXML"></div>
    </form>
</body>

.cs文件中的代码

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static List<Products> GetProducts()
{
    Products product = new Products();
    return product.GetProducts();
}

这是有效但如果我不想在表单中编写Web方法。我已将web引用添加到我的应用程序中,并希望使用来自Web服务的数据。我在jqGrid下面尝试但没有帮助我。

$(function () {
    jQuery("#jqGridXML").jqGrid({
        url: "http://localhost:49493/jqGrid_HttpHandlers/WebService.asmx/GetProducts",
        mtype: "POST",

休息部分相同。

网络服务中的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Collections.Generic;
using System.Collections.ObjectModel;

/// <summary>
/// Summary description for WebService
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{

    public WebService()
    {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat=ResponseFormat.Json)]
    public static List<Products> GetProducts()
    {
        Products product =  new Products();
        return product.GetProducts();
    }


}
你能帮我理解一下吗?我刚开始研究jqGrid。

非常感谢您的帮助。

编辑

是的,你是对的戴夫。我只是取消注释下面的语句并删除静态并运行项目而不做任何修改,它确实工作得很好。

[System.Web.Script.Services.ScriptService]  
public class WebService : System.Web.Services.WebService

谢谢,但我的下一个疑问是,我如何使用jqGrids导航功能,如Paging,使用相同的代码对这些内容进行排序。 我用过这个,

jsonReader: { 
                root: function (obj) { return obj.d;}, 
                page:function (obj) {return 1;}, 
                total: function (obj) {return 1;}, 
                records:function (obj) { return obj.d.length;}, 
                id:"0", 

但我真的不知道在我的代码中需要使用哪一个。你能否请我转发正确的解决方案。

1 个答案:

答案 0 :(得分:0)

您需要取消注释[ScriptService]属性(并且大多数其他装饰都是不必要的)。而且,该方法不能是静态的。 That's only necessary when you declare the methods in ASPX code behind

所以,像这样:

[WebService]
[ScriptService]
public class WebService : System.Web.Services.WebService
{
  [WebMethod]
  public List<Products> GetProducts()
  {
    Products product =  new Products();
    return product.GetProducts();
  }
}