【问题标题】:Sorting in grid panel在网格面板中排序
【发布时间】:2011-09-30 05:56:20
【问题描述】:
    var store = new FMP.AspNetJsonStore({
        fields: [
                       { name: 'AssetID' },
                       { name: 'AssociationID' },
                       { name: 'Image' },
                       { name: 'StatusName' },
                       { name: 'ModelName' },
                       { name: 'IPAddress' },
                       { name: 'InScope', type: 'boolean' },
                       { name: 'ServicePlanName' },
                       { name: 'PricePlanName' },
                       { name: 'PricePlanDescription' },
                       { name: 'Program' },
                       { name: 'ServicePlanID' },
                       { name: 'Customer' },
                       { name: 'Black', type: 'float' },
                       { name: 'Cyan', type: 'float' },
                       { name: 'Magenta', type: 'float' },
                       { name: 'Yellow', type: 'float' },
                       { name: 'BlackPct' },
                       { name: 'CyanPct' },
                       { name: 'MagentaPct' },
                       { name: 'YellowPct' },
                       { name: 'PrinterMarkerSupplies' },
                       { name: 'PageCount' },
                       { name: 'BlackImpressions' },
                       { name: 'ColorImpressions' },
                       { name: 'PricePlanID' },
                       { name: 'ResponsibilityForAction' },
                       { name: 'PrinterSerialNumber' }

                    ],

        totalProperty: "TotalCount",
        autoLoad: { params: { start: 0, limit: myPageSize} },
        //autoLoad: true,
        proxy: new Ext.data.HttpProxy({
            // Call web service method using GET syntax
            url: 'GetPrintersGrid.asmx/buildGrid',
            // Ask for Json response
            headers: { 'Content-type': 'application/json' },
            method: "GET"
        }),
        remoteSort: true,
        //sortInfo: { field: 'PageCount', direction: "DESC" },
        groupField: 'Customer',
        root: 'Records'
    });

    store.setDefaultSort('PageCount', 'DESC');

我正在使用网络服务来排序。

我收到一个错误

{"Message":"Invalid JSON primitive: DESC.","StackTrace":"   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   at System.Web.Script.Services.RestHandler.GetRawParamsFromGetRequest(HttpContext context, JavaScriptSerializer serializer, WebServiceMethodData methodData)\r\n   at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}

谁能帮我解决这个问题

我正在使用Ext.ux.AspWebServiceProxy 类并在商店中使用了这个代理类。还在scriptmanager 代理中的用户控件中定义了webservice 我收到一条错误消息,指出 GetPrintersGrid 未定义。我使用以下示例作为参考。

http://osman.in/aspnet/using-extjs-grid-with-aspnet-ajax-wcf-webservices-c/

你能帮我解决这个问题吗?

/// <reference path="ExtJS/ext-all.js" />

Ext.namespace('Ext.ux');

Ext.ux.AspWebServiceProxy = function(conn)
           {
              Ext.ux.AspWebServiceProxy.superclass.constructor.call(this);
              Ext.apply(this, conn);
           };

Ext.extend(Ext.ux.AspWebServiceProxy, Ext.data.DataProxy, 
{
     load : function (params, reader, callback, scope, arg)
            {
               var userContext = {
                                    callback: callback, 
                                    reader: reader, 
                                    arg: arg, 
                                    scope: scope
                                 };

               var proxyWrapper = this;

               //Handles the response we get back from the web service call
               var webServiceCallback = function(response, context, methodName) 
                                        { 
                                            proxyWrapper.loadResponse(response, userContext, methodName); 
                                        }

               var serviceParams = [];

               //Convert the params into an array of values so that they can be used in the call (note assumes that the properties on the object are in the correct order)
               for (var property in params)
               {
                  serviceParams.push(params[property]);
               }

               //Add the webservice callback handlers
               serviceParams.push(webServiceCallback);
               serviceParams.push(this.handleErrorResponse);

               //Make the actual ASP.Net web service call
               this.webServiceProxyMethod.apply(this.webServiceProxy, serviceParams); 
            },

     handleErrorResponse : function(response, userContext, methodName)
                           {
                              alert("Error while calling method: " + methodName + "\n" + response.get_message());
                           },

     loadResponse : function (response, userContext, methodName)
                    {
                        var result = userContext.reader.readRecords(response);
                        userContext.callback.call(userContext.scope, result, userContext.arg, true);
                    }

});

var dataStore = new Ext.data.Store(
                    {
                        //Note that I have renamed the web service proxy class
                        proxy: new Ext.ux.AspWebServiceProxy(
                        {
                            webServiceProxy: GetPrintersGrid,
                            webServiceProxyMethod:  GetPrintersGrid.buildGrid
                        }),
                       remoteSort: true                       
                    });

 <asp:ScriptManagerProxy ID="PageScriptManager" runat="server">
        <Services>
           <asp:ServiceReference Path="~/GetPrintersGrid.asmx" />
</Services>
        <Scripts>
              <asp:ScriptReference Path="~/Ext.ux.AspWebServiceProxy.js" />
        </Scripts>
    </asp:ScriptManagerProxy>

【问题讨论】:

  • 这仍然不是 ExtJS 问题,但是如果您解决了服务器问题,您需要发布 FMP.AspNetJsonStore 的源代码。
  • 实际上,这很可能是客户端代码问题,因为服务器错误是关于在 Web 服务调用中de序列化从客户端发送到服务器的 JSON。很难从发布的内容中分辨出来......

标签: extjs


【解决方案1】:

这是我使用的源代码 FMP.AspNetJsonReader = Ext.extend(Ext.data.JsonReader, {

        read: function(response) {
            // Assuming ASP.NET encoding - Data is stored as 
            var json = response.responseText;
            var o = Ext.decode(json);
            if (!o) {
                throw { message: "AspNetJsonReader.read: Json object not found" };
            }
            if (!o.d) {
                throw { message: "AspNetJsonReader.read: Root element d not found" };
            }
            return this.readRecords(o.d);

        }

    });

    FMP.AspNetJsonStore = Ext.extend(Ext.data.GroupingStore, {
        /**
        * @cfg {Ext.data.DataReader} reader @hide
        */
        constructor: function(config) {
            FMP.AspNetJsonStore.superclass.constructor.call(this, Ext.apply(config, {
                reader: new FMP.AspNetJsonReader(config)
            }));
        }
    });

我在服务器端使用 AS.NET

这是我的网络服务 public PagedResult buildGrid(int start, int limit, string sortfield, string dir) { var a=5;

    Guid AccountID = (Guid)Session["AccountID"];
    //string sortdir;
    //if( dir == "DESC")
    //{
    //    sortdir = dir.Substring(0, 4).Trim().ToUpper();
    //}
    //else
    //{
    //    sortdir = dir.Substring(0, 3).Trim().ToUpper();
    //}

    string SortExpression = sortfield + " " + (!String.IsNullOrEmpty(dir) ? dir : String.Empty);

    //string whereClause = "SELECT value a FROM XSP_AssetList_V AS a WHERE a.AccountID = GUID'" + AccountID + "' order by a.PageCount = '" +  + "'";
    string whereClause = "SELECT value a FROM XSP_AssetList_V AS a WHERE a.AccountID = GUID'" + AccountID + "' Order By  a."+SortExpression;
    //string whereClause = "SELECT value a , ROW_NUMBER() OVER(ORDER BY" + " " + SortExpression + ") As RowNumber FROM XSP_AssetList_V AS a WHERE a.AccountID = GUID'" + AccountID + "'";
    //string whereClause = "SELECT value a FROM XSP_AssetList_V AS a WHERE a.AccountID = GUID'" + AccountID + "'";
    List<FMPAsset> fmpAssets = new List<FMPAsset>();



    using (XSPAssetModel.XSPAssetEntities assetEntities = new XSPAssetEntities(b.BuildEntityConnectionString1("XSMDSN")))
    {
        ObjectQuery<XSP_AssetList_V> assets = new ObjectQuery<XSP_AssetList_V>(whereClause, assetEntities);
        //var assetOrder = assets.OrderBy(x => x.StatusName).ToList();
        var assetPage = assets.Skip(start).Take(limit);

        //var totalAssetCount = assets.Count();



        currentAssets = assetPage.ToList();
        int currentAssetsCount = currentAssets.Count;
        string imgprefix = System.Configuration.ConfigurationManager.AppSettings["ImgPrefix"];
        char[] separators = { '/' };
        string appname = "";
        int lastloc = imgprefix.Substring(0, imgprefix.Length - 1).LastIndexOfAny(separators);
        if (lastloc > 6)
        {
            appname = imgprefix.Substring(lastloc + 1);
        }


        FMPAsset asset = new FMPAsset();

        //StreamWriter sw = new StreamWriter("C:\\test.txt");

        XSPPrinterMarkerSupplyModel.XSPPrinterMarkerSupplyEntities markerCtx = new XSPPrinterMarkerSupplyModel.XSPPrinterMarkerSupplyEntities(b.BuildEntityConnectionString1("XSMDSN"));

        for (int x = 0; x < currentAssetsCount; x++)
        {
            asset = new FMPAsset();

            asset.AssetID = currentAssets[x].AssetID.ToString();
            asset.PricePlanID = currentAssets[x].PricePlanID.ToString();
            asset.AssociationID = currentAssets[x].AssociationID;
            asset.ModelName = currentAssets[x].ModelName;
            asset.ResponsibilityForAction = currentAssets[x].ResponsibilityForAction;
            asset.IPAddress = (String.IsNullOrEmpty(currentAssets[x].PrinterIPAddress)) ? "No IP" : currentAssets[x].PrinterIPAddress; ;

            if (currentAssets[x].InScope)
            {
                asset.InScope = b.GetString("SDE_YES");
            }
            else
            {
                asset.InScope = b.GetString("SDE_NO");
            }

            asset = SetStatus(appname, asset, x);

            asset.PricePlanName = currentAssets[x].Program;
            asset.PricePlanDescription = currentAssets[x].PricePlanDescription;
            asset.ServicePlanName = currentAssets[x].ServicePlanName;

            if (currentAssets[x].PrinterSerialNumber != null)
            {
                asset.PrinterSerialNumber = currentAssets[x].PrinterSerialNumber;
            }
            else
            {
                asset.PrinterSerialNumber = "-";
            }

            //sw.WriteLine("ChargebackDescription: " + DateTime.Now.Millisecond);
            if (this.b.UseChargebackDescription && !String.IsNullOrEmpty(currentAssets[x].CustomerChargebackDescription) && currentAssets[x].CustomerChargebackDescription != "Generated by OUT Integration")
            {
                asset.Customer = currentAssets[x].CustomerChargebackDescription;

                if (asset.Customer.IndexOf(Environment.NewLine) > -1)
                {
                    asset.Customer = asset.Customer.Substring(0, asset.Customer.IndexOf(Environment.NewLine));
                }
            }
            else
            {
                asset.Customer = currentAssets[x].CustomerChargeBackEntryName;
            }

            if (this.b.UsePricePlanDescription && !String.IsNullOrEmpty(currentAssets[x].PricePlanDescription))
            {
                asset.Program = currentAssets[x].PricePlanDescription;
                if (asset.Program.IndexOf(Environment.NewLine) > -1)
                {
                    asset.Program = asset.Program.Substring(0, asset.Program.IndexOf(Environment.NewLine));
                }
            }
            else
            {
                asset.Program = currentAssets[x].Program;
            }

            asset.BlackPct = -3;
            asset.CyanPct = -3;
            asset.MagentaPct = -3;
            asset.YellowPct = -3;

            Guid id = currentAssets[x].AssetID;

            asset = SetCMYKvalues(asset, x);

            BuilldImpressionsValues(currentAssets[x], ref asset);
            fmpAssets.Add(asset);
        }

        var totalAssetCount = assets.Count();
        var y = new PagedResult<FMPAsset>();
        y.Records =  fmpAssets;
        y.TotalCount = totalAssetCount;
        return y;


        //           CommonGrid1.BindDataSource(SortByStatusName(fmpAssets));


    }

}

【讨论】:

  • 谢谢;如果您将此问题标记为 Java 或 SQLServer 或其他什么,您可能会更幸运。您当前的问题(和以前的问题)是服务器问题 - 无论是您的 SQL 还是您的 Web 服务。当您将其标记为 ExtJS 时,很多人不会查看它,并且可能不会提出可以为您提供答案的问题。
  • 当然我也会在其他人中标记它。
【解决方案2】:

当您的商店调用您的网络服务时,会发生此错误。由于某种原因,发送的任何 JSON 都是无效的(或者 .NET 认为它无效),因此当 ASP.NET 尝试将数据反序列化为您的方法的有效参数列表时,服务器会出错。我会首先查看 Firebug 以确切了解将什么 JSON 传递给服务器——这可能会为您提供有关问题所在的线索。如果发送的 JSON 无效,则为客户端/Ext 问题 - 如果有效,则为 .NET 问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多