2

Asp.net MVC 4 でフォームを送信すると、jqGrid に値が入力されません...理由を知りたいです...この Json 文字列を返す ajax メソッドがあり、それはネットワーク応答ブラウザーの Json 文字列です...

"{\"total\":1,\"page\":1,\"records\":1,\"rows\":[{\"cell\":[\"\",\"342352857634\",\"test\",\"test\",\"5/8/2012 11:39:38 AM\",\"1\",\"\",\"1/1/0001 12:00:00 AM\",\"1/1/0001 12:00:00 AM\",\"1/1/0001 12:00:00 AM\"]}]}"

これはすべてのマジックを行う関数です。

$('#SearchPatID').submit(function (event) {
        //alert("What the motherFuck is going on here!");
        debugger;
        var theURL = this.action;
        var type = this.methd;
        event.preventDefault();
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            dataType: "json",
            success: function (result) {
                debugger;
                bindData(result);
            }
        });
        return false;
    });
    var bindData = function (result) {
    debugger;
    alert('Glad this is kind-of working!');
    $("#list").setGridParam({
        datatype: 'jsonstring',
        datastr: result,
        caption: 'Suck It!'
    }).trigger("reloadGrid");
    }

更新... bindData 関数を Just setGridParam に変更しました。リロード...まだ機能しませんが、最終的に正しい道を進んでいると思います...以下の詳細な更新...

私は何が欠けていますか?私は Json データを持っています。すべてうまくいくはずですよね?

更新:
JSON オブジェクトではなく JSON 文字列を送信していることに気付きました...そのため、データ型を json から jsonstring に変更しました...それでも機能しません。

これが私のJSONデータを返すものです。 私が今試していることへの更新:データに列名を入れてみたかった...何らかの理由でそれが役立つかもしれないと思った

public static object JsonHelper(TemplateModel model){

        var values = model.Template;
        var JsonDataList = new {
            total = 1,
            page = 1,
            records = model.Template.Count,
            rows = (from val in values
                    select new {
                        cell = //new string(
                            "[\"id\" :\"" + val.EncounterId +",\""+
                            //"\"MRN\" :" + 
                            "\"MRN\" :\"" + val.MRN + ",\"" +
                            //"\"Hospital_Fin\" :" + 
                            "\"Hospital_Fin\" :\"" + val.HostpitalFinNumber + ",\"" +
                            //"\"First_Name\" :"+ 
                            "\"First_Name\" :\"" + val.FirstName + ",\"" +
                            //"\"Last_Name\" :" + 
                            "\"Last_Name\" :\"" + val.LastName + ",\"" +
                            //"\"Date_of_birth\" :" + 
                            "\"Date_of_birth\" :\"" + val.DateOfBirth.ToString() + ",\"" +
                            //"\"Completed_Pathway\" :" + 
                            "\"Completed_Pathway\" :\"" + val.CompletedPathway + ",\"" +
                            //"\"Completed_Pathway_Reason\" :" + 
                            "\"Completed_Pathway_Reason\" :\"" + val.CompletedPathwayReason + ",\"" +
                            //"\"PCP_Appointment\" :" + 
                            "\"PCP_Appointment\" :\"" + val.PCPAppointmentDateTime.ToString() + ",\"" +
                            //"\"Specialist_Appointment\" :" + 
                            "\"Specialist_Appointment\" :\"" + val.SpecialistAppointmentDateTime.ToString() + ",\"" +
                            //"\"Admit_Date\" :" + 
                            "\"Admit_Date\" :\"" + val.AdminDate.ToString() + "\"]"                            
                    })//.ToArray()
        };
        return JsonDataList;
    }

プラス...

return Json(DataRepository.JsonHelper(model.FirstOrDefault()), JsonRequestBehavior.AllowGet);

これがjqGridのセットアップ方法です...

$(document).ready(function () {
        $("#list").jqGrid({
                        shrinkToFit: false,
                        autowidth: true,
                        datatype: 'local',
                        mtype: 'POST',
                        colNames: ['Edit',
                                   'MRN',
                                   'Hospital Fin',
                                   'First Name',
                                   'Last Name',
                                   'Date of birth',
                                   'Completed Pathway',
                                   'Completed Pathway Reason',
                                   'PCP Appointment',
                                   'Specialist Appointment',
                                   'Admit Date'
                                   ],
                        colModel: [
                                   { name: 'Edit', width: 95, align: 'left' },
                                   { name: 'MRN', width: 125, align: 'left' },
                                   { name: 'Hospital_Fin', width: 145, align: 'left' },
                                   { name: 'First_Name', width: 115, align: 'left' },
                                   { name: 'Last_Name', width: 115, align: 'left' },
                                   { name: 'Date_of_birth', width: 145, align: 'left' },
                                   { name: 'Completed_Pathway', width: 125, align: 'left' },
                                   { name: 'Completed_Pathway_Reason', width: 165, align: 'left' },
                                   { name: 'PCP_Appointment', width: 115, align: 'left' },
                                   { name: 'Specialist_Appointment', width: 125, align: 'left' },
                                   { name: 'Admit_Date', width: 185, align: 'left' }],
                        rowNum: 10,
                        rowList: [5, 10, 20, 50],
                        sortname: 'Id',
                        sortorder: "desc",
                        viewrecords: true,
                        imgpath: '/Content/themes/UPMC-theme/images',
                        caption: 'My first grid'
    }); })

データ型を「ローカル」に設定してから setGridParam と trigger('reload') を実行すると、何らかの形で役立つことをオンラインのどこかで読みました。論理的に思えます。しかし、それがどのように機能するかはまだ少しわかりません...まだ機能していませんが、古い大学で試してみています...

UDPATE: 詳細な説明 私の JsonHelper は有効な JsonString を書き出そうとしています...これを定期的に行う方法の例はありますか? 標準の Json ActionHelper を使用するときはいつでも...別のオブジェクトの戻り値を作成できると思いますが、それは、より多くのlinqをいじる必要があることを意味します...そして、それは別の日の冒険です。

**更新 2: 数か月が過ぎました" こんにちは。別のプロジェクトに約 1 か月気を取られていました。それが終わり始めたので、このコードは再び私を悩ませ始めています。私はとても近づいているように感じます。しかし、まだこれまで...

とにかく、これは私が話していた空のjqGridの例です... 空の jqGrid の例
ご覧のとおり、2行のデータがありますが、どちらにも通常必要なデータがありません...

デバッグモードでのデータは次のようになります...

["id" :"2005,""MRN" :"840108105,""Hospital_Fin" :"999999999999985,""First_Name" :"BETTY,""Last_Name" :"WHITE,""Date_of_birth" :"1/18/1951 12:00:00 AM,""Completed_Pathway" :",""Completed_Pathway_Reason" :",""PCP_Appointment" :"6/12/2012 12:00:00 AM,""Specialist_Appointment" :"6/12/2012 12:00:00 AM,""Admit_Date" :"7/5/2012 12:00:00 AM"]
["id" :"2025,""MRN" :"840108105,""Hospital_Fin" :"789654123000123,""First_Name" :"BETTY,""Last_Name" :"WHITE,""Date_of_birth" :"1/18/1951 12:00:00 AM,""Completed_Pathway" :",""Completed_Pathway_Reason" :",""PCP_Appointment" :"1/1/0001 12:00:00 AM,""Specialist_Appointment" :"1/1/0001 12:00:00 AM,""Admit_Date" :"7/6/2012 12:00:00 AM"]

それは私のJSONヘルパーからすぐに出てきます...これは基本的に、返されるモデルから2つの文字列オブジェクトを作成します...これは、バインド中にクライアント側でJSONデータがどのように見えるかです...

{"total":1,"page":1,"records":2,"rows":[{"cell":"[\"id\" :\"2005,\"\"MRN\" :\"840108105,\"\"Hospital_Fin\" :\"999999999999985,\"\"First_Name\" :\"BETTY,\"\"Last_Name\" :\"WHITE,\"\"Date_of_birth\" :\"1/18/1951 12:00:00 AM,\"\"Completed_Pathway\" :\",\"\"Completed_Pathway_Reason\" :\",\"\"PCP_Appointment\" :\"6/12/2012 12:00:00 AM,\"\"Specialist_Appointment\" :\"6/12/2012 12:00:00 AM,\"\"Admit_Date\" :\"7/5/2012 12:00:00 AM\"]"},{"cell":"[\"id\" :\"2025,\"\"MRN\" :\"840108105,\"\"Hospital_Fin\" :\"789654123000123,\"\"First_Name\" :\"BETTY,\"\"Last_Name\" :\"WHITE,\"\"Date_of_birth\" :\"1/18/1951 12:00:00 AM,\"\"Completed_Pathway\" :\",\"\"Completed_Pathway_Reason\" :\",\"\"PCP_Appointment\" :\"1/1/0001 12:00:00 AM,\"\"Specialist_Appointment\" :\"1/1/0001 12:00:00 AM,\"\"Admit_Date\" :\"7/6/2012 12:00:00 AM\"]"}]}

私のデータを見るだけで、それはちょっとめちゃくちゃに見えます。修正すれば見栄えが良くなるか試してみます。しかし、他にアドバイスがあれば、私は間違いなく感謝します。

4

2 に答える 2

1

あなたが使用しているサーバー コードに重大な問題があると思います。$.ajaxパラメータでリクエストを行う場合は、データをオブジェクトdataType: "json"$.ajax変換します。サーバーからの応答は、返されたオブジェクトを JSON に2 回変換したように見えます。

、、およびプロパティを持つオブジェクトをtotal、最初にorを使用して手動で JSONに変換し、次に を使用して結果文字列を返したとします。その結果、文字列はさらにエンコードされます。pagerecordsrowsJavaScriptSerializerDataContractJsonSerializerreturn Json(myJsonString);JSON

さらに、必要なパラメーターの代わりにdatastr: result使用する必要があるデータを使用する場合。datatype: 'jsonstring'datatype: 'json'url

信頼を伝えるには、コードに他の問題があります。要素からグリッドを$("#list").jqGrid({...}); 作成<table id="list"></table>し、コードを一度だけ実行できます。現在のコードは、bindDataフォームの送信ごとに関数を複数回呼び出すことができるように記述されています。

さらに、gridview: falsewhich を使用するとパフォーマンスが低下します (常に を使用する必要がありますgridview: true)。オプションimgpathは何年もの間jGridに存在しませんでした。jqGrid の非常に古い使用例を取得し、目的に合わせて変更しようとしたと思います。

回答これを出発点とするなど、より最近の例を入手することをお勧めします。直接使用datatype: 'json'して、追加のパラメーターをサーバーに送信することをお勧めします。たとえば、ここで説明されているように、または$.serializeArrayたとえば使用します (こちらを参照)。

更新: JSON オブジェクトはありません。オブジェクトだけを持っているか、JSON 標準に対応するエンコードされたオブジェクトを表す文字列を持っています。

を使用する必要はありませんJsonHelper。MVC アクションは次のJson(theObject)ように返されます。

return new {
        total = 1,
        page = 1,
        records = model.Template.Count,
        rows = ...

};

さらに、ここで説明されている jqGrid の JSON データのデフォルト形式。あなたが投稿したコードにJsonHelper

rows = (from val in values
        select new {
            invdata = new string[]{ ...}
        }).ToArray()

and generate rows as array of objects without id property and with invdata property instead of cell. To read the data you need at least include jsonReader: {cell: "invdata"}. The better would be to return correct data having id. If some from the column tables could be interpreted as unique id of the row you can include key: true in the corresponding column, use jsonReader: {cell: ""} and fill rows as List<List<string>> or as array which elements as array or strings.

于 2012-06-08T22:14:04.097 に答える
0

evalが不足していると思います。

  success: function (result) {
            debugger;
            var data = eval("(" + result.d + ")");
            bindData(data);
        }
于 2012-06-08T22:24:22.547 に答える