【问题标题】:Populating jqGrid with JSON -- Performance using WCF vs ASMX for the backend使用 JSON 填充 jqGrid——使用 WCF 与 ASMX 作为后端的性能
【发布时间】:2011-06-14 00:49:48
【问题描述】:

我正在使用一个 ASMX 后端来填充 jqGrid 客户端,包括客户端的网格分页,以便一次加载所有数据行。我的问题是这是否是最好的方法性能和可靠性?此外,如果 WCF 比 ASMX 更好,那么将这个现有设置转换为 WCF 是否相当容易(我猜我应该使用 REST 样式的 WebGet 方法,但我并不肯定)。只希望一切都尽可能快速和响应迅速,理想情况下几乎没有回发。

这是 ASMX 代码:

public class JQGrid
{
    public class Row
    {
        public int id { get; set; }
        public List<string> cell { get; set; }
        public Row()
        {
            cell = new List<string>();
        }
    }

    public int page { get; set; }
    public int total { get; set; }
    public int records { get; set; }
    public List<Row> rows { get; set; }
    public JQGrid()
    {
        rows = new List<Row>();
    }
}  

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]
[ScriptService]
public class JQGridService : System.Web.Services.WebService
{
    [WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public JQGrid GetJQGrid(int pageIndex, int pageSize, string sortIndex, string sortDirection)
    {
        DataTable dt = GetDataTable( // command string ); 

        if (dt == null)
            throw new Exception("Unable to retrieve data.");

        JQGrid jqGrid = new JQGrid();

        foreach (DataRow sourceRow in dt.Rows)
        {
            JQGrid.Row targetRow = new JQGrid.Row();
            targetRow.id = Convert.ToInt32(sourceRow["ID"]);
            targetRow.cell.Add(sourceRow["ID"].ToString());
            targetRow.cell.Add(sourceRow["SomeColumn"].ToString());
            jqGrid.rows.Add(targetRow);
        }

        jqGrid.page = pageIndex; 
        jqGrid.records = jqGrid.rows.Count;
        jqGrid.total = jqGrid.rows.Count;  // Set this to total pages in your result...          

        return jqGrid;
    }
}

客户端 JS:

function getData(pdata)
     {
         var params = new Object();

        params.pageIndex = pdata.page; 
        params.pageSize = pdata.rows;
        params.sortIndex = pdata.sidx;
        params.sortDirection = pdata.sord;

        $.ajax(
            {
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "JQGridService.asmx/GetJQGrid",
                data: JSON.stringify(params),
                dataType: "json",
                success: function (data, textStatus) 
                {
                    if (textStatus == "success") {
                        var thegrid = $("#jqGrid")[0];

                        thegrid.addJSONData(data.d);
                    }
                },
                error: function (data, textStatus) {
                    alert('An error has occured retrieving data!');
                }
            });
        }

        function pageLoad() { loadGrid() }; 

        function loadGrid() {

            $("#jqGrid").jqGrid({

                gridComplete: function() {
                    $("#jqGrid").setGridParam({ datatype: 'local' });  
                },
                datatype: function (pdata) {
                    getData(pdata);
                },
                colNames: ['ID', SomeColumn],
                colModel: [
                    { name: 'ID', index: 'ID', width: 150 },
                    { name: SomeColumn, index: SomeColumn, width: 250}],
                rowNum: 10,
                rowList: [10, 20, 30],
                viewrecords: false,
                pagination: true,
                pager: "#jqPager",
                loadonce: true,
                sortorder: "desc",
                sortname: 'id',
                cellEdit: false
            });
        }

【问题讨论】:

  • A 同意 David Hoerster 的观点,即 WFC 是最佳选择。我只想建议您重写您的客户端部分以不使用 datatype 作为函数。此外,您应该使用sortname: 'ID' 而不是sortname: 'id' 并使用loadonce:true 而不是手动将datatype 更改为'local' 内部的gridComplete。而不是使用 params 重命名 postData 您可以针对 jqGrid 的 prmNames 选项执行此操作:prmNames: {page: 'pageIndex', rows: 'pageSize', sort: 'sortIndex', order: 'sortDirection'}

标签: javascript jquery asp.net wcf jqgrid


【解决方案1】:

我从 Microsoft 版主 (Gregory Leake) 的论坛上找到了this response,关于是否使用 ASMX 或 WCF Web 服务。关键引述(对我而言):

WCF 是微软的战略 .NET 的通信技术。 支持 ASMX;但不是 未来

自从框架发布 3.5 SP1 以来,我个人就没有使用过 ASMX 服务,并且随着 .NET 4 框架中发布的WCF WebHttp Services 功能,我没有回头。

改用 ASMX 的 WCF REST 服务可能只涉及:

  1. 使用DataContractDataMember 属性装饰您的JQGrid 类;
  2. 显然,创建了 WCF 服务接口 (IJQGridService) 和实现类 (JQGridService)。您的JQGridService 的实现可能会发生很大变化,除了类上的属性,通过将当前属性替换为 WebGetAttribute(在接口上)和 AspNetCompatibilityRequirementsModeAttribute(在实现类上)。
  3. 一些 web.config 更改,因为您现在将有一个 &lt;system.serviceModel&gt; 部分;但是,如果您将启用 AJAX 的 WCF 服务添加到您的项目中,那么这些设置中的大部分已经为您准备好了。您可能想要更改的唯一一件事是使用 &lt;webHttp/&gt; 而不是 &lt;enableWebScript&gt; 的 endpointBehavior。
  4. 您不必对客户端 JS 进行任何更改,除非在您的服务名称发生更改时更改 URL(它可能会更改),并且您还应该更改为使用来自 @987654333 的 GET 动词@ 因为您只是在检索数据。 jqGrid 在处理查询字符串分页所需的参数方面做得很好。

除此之外,你可能很高兴。

我希望这会有所帮助。如果还有其他问题,请告诉我,我会更新此答案。

祝你好运!

【讨论】:

  • 啊,谢谢。我认为 / 问题是我之前尝试 WCF 时所缺少的。
  • 正确格式化了我的编号列表 - 不敢相信我没有这样做!
  • 效果很好。现在我只需要找出一种方法来动态设置 JQGrid 的 colModel(对于不同的实体)——我想使用另一个 wcf WebGet 方法,如果可能的话,它基本上可以将所需的模式作为字符串获取。
  • 这是可能的——您必须先获取 colModel,或者使用数据获取它,然后动态(在客户端)绑定到网格。我尝试这样做,但我的列并不总是与我的数据对齐,但出现了一些奇怪的行为。这是一年多以前的事了,这可能是因为我试图快速制作原型。此外,如果您使用的是 MVC,您可能需要查看 Trirand.net 的 jqGrid 的 ASP.NET MVC 助手(Trirand 推出了 jqGrid)。不过,它不是免费的。我认为这是 500 美元/开发人员。 trirand.net/demoaspnetmvc.aspx。他们可能也有一些适用于 ASP.NET Webforms 的东西。
  • 我在上面链接到的助手允许您在服务器端设置 colModel,然后以这种方式设置网格。它可能做了你在引擎盖下描述的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多