5

私は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
                });
}

WebMethod



        [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); 

        }

現在のコード

今は正しく動作していますが、最後に1つ質問があります。コンテンツを表示するために「repeatitems:false」を設定する必要があるのはなぜですか?

これを機能させるための注意点のいくつかには、ajaxリクエストを設定するさまざまな方法が含まれます。

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

そして最後に、JSONReaderのセットアップ方法に関するドキュメントからドキュメントを理解します。

これが他の人の助けになることを願って、オレグにあなたのすべての助けに感謝します。

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"
    })
}

Webメソッド


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

リストからの1つの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}
4

2 に答える 2

12

まず第一に、回答のコード例がお役に立てば幸いです(この回答も参照してください)。主なアイデアは、次の追加の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" };

サーバーが応答に、、、およびパラメーターを設定せずrowspageあなたtotalrecords場合のようにデータのリストを返す場合は、次を使用できます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

さらに、コードにはいくつかの問題があります。1つ目はJavaScriptSerializer.Serialize、Webメソッドで手動で呼び出すことです。dataType: "json"JSONを使用する場合、応答はによってオブジェクトに変換されます$.ajax。あなたの場合もそうです。そのため、ハンドラーのmsgパラメーターにはプロパティがあります。ただし、これはオブジェクトではなく、。を使用してオブジェクトに変換するもう1つのJSON文字列です。その理由は、メソッドの結果がもう一度JSONに変換されるためです。successdmsg.deval(msg.d)

この問題を修正するには、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メソッドにadditional[ScriptMethod (ResponseFormat = ResponseFormat.Json)]または[ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]attributeを使用しますが、多くの場合(あなたの場合もそうです)、それは必要ありません。

、を使用すると、ajaxGridOptionsjqGridはデータのページを読み取ることができますが、データはJSON形式である必要があり、2回エンコードされたJSON形式であってはなりません。serializeGridDatajsonReader

更新:データを読み取れるようにするためにの設定を使用する必要がある理由についてコメントを求められます。どのように機能するかを理解するための重要な質問ですが、答えは少し変わります。repeatitems:falsejsonReaderjsonReader

一般に、JSONデータをjqGrid用にフォーマットする方法には2つの主要なスタイルがあります。グリッド行のデータの配列である必要があります。配列のすべての項目はグリッド内の行を表し、行は2つの主要な形式から1つである必要があります

1)次のような名前付きプロパティを持つオブジェクトとして

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

または2)次のような文字列の配列

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

また

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

jqGridは、設定の場合、「true」と「1」の両方の値をブール値「true」にマップしedittype:'checkbox'ます。グリッドに多くのチェックボックス列があるかどうかを理解する方法「1」/「0」形式を使用すると、転送されるデータのサイズを減らすことができます。

このrepeatitems:falseオプションは、jqGridがJSONデータをスキャンしてデータの最初の(オブジェクトスタイル)表現を探す必要があることを意味します。はrepeatitems:true、2番目の(配列スタイル)表現を意味します。

ちなみに、オブジェクトスタイル(repeatitems:false)を使用すると、のcell設定は使用jsonReaderれず、使用している設定を削除することができcell:''ます。

グリッドに一意の値を持つ列が1つある場合は、数値形式のidオプションが実用的です。jsonReaderこのオプションid:'0'は、列「ユーザー名」の値が行IDとして使用されることを意味します。IEまたはChromeの開発者ツールのFirebugを使用してグリッドを調べると、対応する<tr>要素に属性id="TestUser"(データで使用されている)があることがわかります。1つのHTMLページでIDの重複は許可されていないため、正しい一意のIDでグリッドを定義することが非常に重要であることを理解できます。jqGridがデータ内にid列を見つけられない場合、ids "1"、 "2"、...を使用します。したがって、グリッドに値があることがわかった場合は、のidプロパティでエラーを検索する必要がありjsonReaderます。

次に重要なのは、データ表現の2つの方法(オブジェクトスタイル(repeatitems:false)と配列スタイル(repeatitems:true))の長所と短所です。

オブジェクトスタイルには、主に2つの場合に利点があります

  1. サーバーでの作業をできるだけ少なくして既存のオブジェクトを投稿したい(迅速で汚い解決策)
  2. 変更できないインターフェースのデータをサーバーから取得します。

他のすべての状況では、配列スタイル(repeatitems:true)にはオブジェクトスタイルと比較して利点があります。そこからのメイン

  1. オブジェクトスタイル表現では、必要に応じてより多くのデータが頻繁に送信されます。あなたの例では、例えば「コメント」プロパティが送信されますが、これはjqGridでは使用されません。
  2. すべての行でプロパティの名前(定数)を転送しないため、配列スタイルのデータははるかにコンパクトになります。

したがって、転送されるデータのサイズを縮小し、サーバー側で変更を加えることができる場合はrepeatitems:true、データの表現の配列スタイル()を使用することをお勧めします。のcell:''プロパティをjsonReaderうまく利用できる場合。

、、およびについてのjqGridドキュメントの一部を確認することをお勧めします。jsonReaderxmlReaderlocalReader

于 2011-03-01T21:23:55.343 に答える
0

また、jqGridをWebMethodと連携させるのに苦労しました。以下に、最後に機能したものを示します。

ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GridTest.aspx.cs" Inherits="SMFLWeb.GridTest" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <!--  jQuery-UI theme Redmond is used. The UI iles should be copied to the following location -->
    <link rel="stylesheet" type="text/css" media="screen" href="css/Redmond/jquery-ui.css" />

    <!--  This is a CSS file from jqGrid download -->
    <link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />

    <!--  jQuery file -->
    <script src="Scripts/jquery-1.11.3.min.js"></script>

    <!--  Following two jqGrid Script Files.  -->
    <script src="js/i18n/grid.locale-en.js" type="text/javascript"></script>
    <script src="js/jquery.jqGrid.js" type="text/javascript"></script>

    <script>

        $(document).ready(function () {

            $("#grid").jqGrid({
                url: "GridTest.aspx/GetMyGames",
                mtype: 'POST',
                postData:
                {
                    useMyFilter: "1"
                },
                datatype: "json",
                ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
                serializeGridData: function (postData) {
                    return JSON.stringify(postData);
                },
                jsonReader: {
                    repeatitems: false,
                    root: function (obj) { return obj.d; }
                },
                colNames: ['GameID', 'GameName'],
                colModel: [
                    { name: 'GameID', index: 'GameID', width: 250},
                    { name: 'GameName', index: 'GameName', width: 250}
                ],
                rowNum: 2,
                /*rowList: [10, 20, 30],*/
                pager: '#pager2',
                sortname: 'id',
                viewrecords: true,
                sortorder: "desc",
                caption: "JSON Example",
                gridview: true,
                height: "auto",
                loadonce: true,
                recordtext: "Records {0} - {1} of {2}",
                emptyrecords: "No records to view",
                loadtext: "Loading...",
                pgtext: "Page {0} of {1}"
            });


        });


    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table id="grid"></table>
            <div id="pager2"></div>

        </div>
    </form>
</body>
</html>

コードビハインド

namespace SMFLWeb
{
    public partial class GridTest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        [System.Web.Services.WebMethod(BufferResponse = false)]
        public static List<Game> GetMyGames(string useMyFilter)
        {
            List<Game> games = new List<Game>();
            Game g1 = new Game();
            g1.GameID = 1;
            g1.GameName = "A";

            Game g2 = new Game();
            g2.GameID = 2;
            g2.GameName = "B";

            Game g3 = new Game();
            g3.GameID = 3;
            g3.GameName = "C";

            Game g4 = new Game();
            g4.GameID = 4;
            g4.GameName = "D";

            Game g5 = new Game();
            g5.GameID = 5;
            g5.GameName = "E";

            games.Add(g1);
            games.Add(g2);
            games.Add(g3);
            games.Add(g4);
            games.Add(g5);

            return games;
        }


    }
}
于 2015-07-19T00:55:47.610 に答える