当前位置: 首页 > 面试题库 >

JQGrid-无法调用ASP.NET WebMethod,但可以使用Ajax

宓英哲
2023-03-14
问题内容

我是jqGrid的新手,但发现很难按照jqGrid文档进行操作

我无法弄清楚设置JQGrid时如何调用WebMethod。我已经成功进行了Ajax调用以获取数据,然后使用本地数据设置JQGrid。我认为这是设置过程中的一个额外步骤,我应该能够使用url属性提供webmethod的路径。

editurl属性是相同的方式。我从未真正收到过发布到服务器的帖子。

原始码

尝试了JQGrid设置

function GetData()
{
    $('#list').jqGrid({
        type: "POST",
        url: "Default.aspx/GetUsersJSON",
        datatype: "json",
        height: 250,
        colName: ['Username', 'Email'],
        colModel: [
                ...
    }).jqGrid(
                'navGrid',
                '#pager',
                {
                    edit: true,
                    add: true,
                    del: true
                });
}

Web方法

        [WebMethod]
        public static string GetUsersJSON()
        {
            var users = new List();
            using(UserAdministrationSandboxDataContext uasd = new UserAdministrationSandboxDataContext())
            {
                users = uasd.GetUserList();                
            }
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(users);

        }

当前代码

我现在知道它可以正常工作,但是我还有最后一个问题。为什么必须设置“ repeatitems:false”才能显示内容?

要使它起作用的一些注意事项包括设置ajax请求的不同方法。

(Ajax:type)是(jqgrid:mtype)(Ajax:contentType)是(jqgrid:ajaxGridOptions:{contentType:})

最后,从文档中了解如何设置JSONReader的文档。

希望这对其他人有所帮助,并感谢Oleg的所有帮助。

JS

function GetUserDataFromServer()
{
    $('#list').jqGrid({
        url: "Default.aspx/GetUsersJSON",
        mtype: 'POST',        
        ajaxGridOptions: { contentType: "application/json" },
        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: ['Username', 'Email'],
        colModel: [
                {
                    name: 'Username',
                    index: 'Username',
                    width: 100,
                    editable: true
                },
                {
                    name: 'Email',
                    index: 'Email',
                    width: 220,
                    editable: true
                },
                {
                    name: 'IsLockedOut',
                    index: 'IsLockedOut',
                    width: 100,
                    editable: true,
                    edittype: 'checkbox'
                }
        ],
        caption: "Users"
    })
}

网络方法

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public static List GetUsersJSON()
        {
            using (UserAdministrationSandboxDataContext uasd = new UserAdministrationSandboxDataContext())
            {
                return uasd.GetUserList();
            }
        }

列表中的一个JSON对象

{"__type":"UserAdministrationSandbox.UserData","PKID":"00000000-0000-0000-0000-000000000001","Username":"TestUser","ApplicationName":"Test","Email":"TestUser@test.com","Comment":"TestUser","Password":"D41D8CD98F00B204E9800998ECF8427E","PasswordQuestion":"Is this a blank Password?","PasswordAnswer":null,"IsApproved":true,"LastActivityDate":"\/Date(1298869200000)\/","LastLoginDate":"\/Date(1298869200000)\/","LastPasswordChangedDate":"\/Date(1298869200000)\/","CreationDate":"\/Date(1298869200000)\/","IsOnLine":false,"IsLockedOut":false,"LastLockedOutDate":"\/Date(1298869200000)\/","FailedPasswordAttemptCount":0,"FailedPasswordAttemptWindowStart":null,"FailedPasswordAnswerAttemptCount":null,"FailedPasswordAnswerAttemptWindowStart":null}

问题答案:

首先,我希望答案中的代码示例可以为您提供帮助。主要思想是,您应该使用以下附加jqGrid参数

ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
serializeGridData: function (postData) {
    return JSON.stringify(postData);
},
jsonReader: { root: "d.rows", page: "d.page", total: "d.total",
              records: "d.records" };

如果服务器没有设置rowspagetotalrecords参数的响应,只是在你的情况下,返回的数据列表一样,你可以使用下面的jsonReader

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

(请参见此处)。如果您不想实现服务器端数据分页,排序和过滤,我建议您使用loadonce:true

而且您的代码有一些问题。第一个是您JavaScriptSerializer.Serialize在网络方法中手动调用。如果使用dataType: "json"JSON响应,则将通过转换为object
$.ajax。您的情况也是如此。因此,处理程序的msg参数success具有d属性。但这msg.d不是对象,而是另一个JSON字符串,您可以使用将该字符串转换为对象eval(msg.d)。原因是您的方法的结果将再次转换为JSON。

要解决此问题,您应该将Web方法GetUsersJSON更改为以下内容:

[WebMethod]
[ScriptMethod (ResponseFormat = ResponseFormat.Json)]
public static List<User> GetUsersJSON()
{
    using(UserAdministrationSandboxDataContext uasd =
                                    new UserAdministrationSandboxDataContext())
    {
        return uasd.GetUserList();                
    }
}

那么您可以将data: eval(msg.d)上一个示例放置到中data: msg.d

通常,一种使用web方法的附加属性[ScriptMethod (ResponseFormat = ResponseFormat.Json)][ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]属性,但是在许多情况下(在您的情况下似乎也是如此)不需要使用此方法。

使用和之后ajaxGridOptions,jqGrid将能够读取数据页面,但是数据应为JSON格式,而不是两次编码的JSON格式。serializeGridData``jsonReader

更新 :您要求我发表评论, 为什么
您需要使用中的repeatitems:false设置jsonReader才能读取您的数据。这是了解jsonReader工作方式的重要问题,但答案将占很小的位置。

通常,有两种主要样式可以为jqGrid格式化JSON数据。它应该是网格行的数据数组。数组的每一项都代表网格中的行,并且该行应为两个主形式中的一个

1)作为具有命名属性的对象,例如

{"Username":"TestUser","Email":"TestUser@test.com","Comment":"..","IsApproved":true}

或2)像这样的字符串数组

["TestUser","TestUser@test.com","true"]

要么

["TestUser","TestUser@test.com","1"]

jqGrid在edittype:'checkbox'设置的情况下将“ true”和“ 1”值都映射到布尔值“ true”
。如何了解网格中是否有许多复选框列,使用“ 1” /“ 0”格式可以减小传输数据的大小。

repeatitems:false选项意味着jqGrid应该扫描JSON数据以查找数据的第一个(对象样式)表示形式。该repeatitems:true装置的第二个(阵列式)表示。

顺便说一句,如果您使用对象样式(repeatitems:falsecelljsonReader
不会使用的cell:''设置,您可以删除使用的设置。

如果网格中的一列具有唯一值id,则jsonReader采用数字形式的选项很实用。该选项id:'0'意味着“用户名”列的值将用作行ID。如果使用IE或Chrome开发人员工具的Firebug检查网格,则会看到相应的<tr>元素具有属性id="TestUser"(用于数据中)。由于在一个HTML页面上不允许在ID中重复ID,因此您可以理解,使用正确的唯一ID定义网格非常重要。如果不jqGrid的数据中找到ID列它将使用ID为“1”,“2”,......所以,如果你看到你的网格有你应该寻找在错误的价值id的财产jsonReader

接下来的重要事情是数据表示的两种方式的优缺点:对象样式(repeatitems:false)和数组样式(repeatitems:true

对象样式在两种主要情况下具有优势

  1. 您只想在服务器上以较少的工作量发布现有对象(快速而肮脏的解决方案)
  2. 您从服务器获取的数据无法更改。

在所有其他情况下,数组样式(repeatitems:true)与对象样式相比具有优势。从那里主要

  1. 在对象样式表示中,将 根据需要 频繁发送 更多数据 。在您的示例中,将发送“注释”属性,而jqGrid不会使用该属性。
  2. 数组样式的数据更加紧凑,因为您不会在每一行中传输属性的名称(它们是 html" target="_blank">常量 )。

因此,如果您想减少传输数据的大小,并且可以在服务器端进行更改,我建议您使用repeatitems:true数据表示形式的数组样式()。在这种情况下的cell:''该财产jsonReader可以很好的使用。

我建议你看看,虽然jqGrid的文档的部分约jsonReaderxmlReaderlocalReader



 类似资料:
  • 问题内容: 我正在尝试使用刚刚更改的新数据重新加载网格,以便用户可以看到经过修改的新数据。 我的方法: 当我单击此按钮时..我正确地发送了数据,但是当我重新加载它时未用新数据更新..如果有人可以提供帮助,我将非常感谢.. 问题答案: 我在这里看到的是发布的Ajax调用和另一个重新加载网格的调用。这里的问题是哪个ajax调用将首先完成?你不知道。最好的选择是使用Ajax帖子中的成功回调函数。仅当发布

  • 我的POJO课程如下: 当我试图从我的tst/文件夹创建XYZ类的对象时,它失败了,错误是构造函数不能从外部包访问,但当我在POJO中使用@必需的ArgsConstructor时,它开始正常工作,并且不显示错误。实际错误如下: 错误:XYZ(字符串、字符串、状态)在XYZ中不是公共的;无法从包外部访问 所以,我想知道@AllArgsConstructor(由@Value提供)和@必需ArgsCon

  • 我试图通过使用REST API查询SharePoint结果源来查看是否可以使用JQGrid显示SharePoint搜索结果。 使用REST API调用结果源代码在浏览器和邮递员中工作: var apiUrl=\u spPageContextInfo.webAbsoluteUrl/\u api/search/query?querytext='Mike' 但当我在JQGrid中使用它时,在第44行得到

  • 问题内容: Java具有允许Java调用javascript的脚本管理器,如下所示: 我的问题是,如果我有sayHi()函数,是否可以通过脚本引擎使用javascript来调用Java函数?谢谢。 问题答案: 从JavaDocs迅速被黑客入侵。 输出量

  • 问题内容: 为什么此SQL不起作用? 这: 子句只是从搜索点计算顺序。 我正在将其别名(因为它太长了)到“距离”。 在这里,我用冗长的短语替换了“ Distance <30”,它可以正常工作。 我什至可以对列别名进行ORDER BY,这行得通!!? 我究竟做错了什么? 问题答案: 发生这种情况是由于自然的查询处理顺序,如下所示: | 您要在语句中分配别名。如您所见,它是在处理之前和之后处理的。那就