1

私はjqGridを使用しており、インライン編集と行追加を行っています。サーバー側のコードにJavascriptとC#を使用したMVCを使用して、クライアント側ですべてをセットアップしています。インラインの保存および行の追加関数がサーバーから返される場合を除いて、すべてが正常に機能しているようです。保存が失敗したりエラーが発生したりした場合、クライアントは応答を認識していないようです。afterSubmit、afterSaveなどを処理するためにいくつかの基本的な関数を設定しましたが、それが機能する唯一のインスタンスは更新アクションです。行を編集または追加するたびに、応答が戻ってこないように見え、グリッドが更新されません。

これで見つけたものはすべて、これを処理するためのグリッドの基本的な設定ですが、適切な応答が返されないか、一部の関数が正しく設定されていない可能性があります。私はこことTrirandのフォーラムでwikiのドキュメントといくつかの投稿を読みましたが、情報にギャップがあり、同じ問題が残っています。

明確にするために、手動更新などと同様に、編集と追加は正常に機能します。唯一の問題は、サーバーからの応答を返し、編集が完了した後にグリッドにデータを再ロードすることです。

これは、グリッドと関数に関連する私のクライアントコードです。

私のAfterFunctions:

var actionAfterSubmit = function (response, postdata) {
    var res = response.responseText;
    alert('In actionAfterSubmit');
    return [true, ''];
};

var actionbeforeSubmit = function (response, postdata) {
    //var res = response.responseText;
    alert('In beforeSubmit');
    return true;
};

var actionAfterSave = function (rowid, response) {
    alert('In actionAfterSave');
};

var actionErrorFunc = function (rowid, response) {
    alert('In actionErrorFunc');
};

var actionSuccessFunc = function (response) {
    alert('In actionSuccessFunc');
    return true;

};      

私のグリッド:

jQuery("#list").jqGrid({
        url: ServiceURL + '/Controller/GetDataAction', //URL that loads data including search functionality
        datatype: 'json',
        mtype: 'GET',
        postData: { tableName: t_Name },
        editData: { tableName: t_Name },
        colModel: col_model, //col_model is passed as parameter
        pager: jQuery('#pager'), //sets pager name
        rowNum: 20, //default number of rows
        rowList: [10, 20, 50, 100], //number of row options
        sortname: 'id', //sorting columns
        sortorder: "asc", //sorting order
        viewrecords: true,
        altRows: true, //enables different styling for alternate rows
        altclass: 'myAltRowClass', //Alternate row styling
        width: "100%",
        height: "100%",
        caption: '',
        navigator: true, //enables navigator toolbar
        multipleSearch: true, //enables multiple search features
        multipleGroup: true, //enables grouping in multiple search
        editurl: ServiceURL + '/Controller/GridSaveAction' //URL that handles edit (insert & update) }); var editOptions = {
        width: 400,
        height: 'auto',
        addCaption: "Add Record",
        editCaption: "Edit Record",
        bSubmit: "Submit",
        bCancel: "Cancel",
        bClose: "Close",
        saveData: "Data has been changed!",
        bYes: "Yes",
        bNo: "No",
        bExit: "Cancel",
        recreateForm: true,
        url: ServiceURL + '/ICMP/MapTable/GridSave/',
        reloadAfterSubmit: true,
        closeOnEscape: true,
        closeAfterEdit: true,
        viewPagerButtons: false,
        afterSubmit: actionAfterSubmit,
        afetrsavefunc: actionAfterSave,
        reloadAfterSubmit: true,
        datatype: 'json'

    };

マイパラメータとその他のグリッド設定:

var addOptions = {
        afterSubmit: actionAfterSubmit,
        aftersavefunc: actionAfterSave,
        errorfunc: actionErrorFunc,
        successfunc: actionSuccessFunc,
        afterComplete: refreshTableAfterAddOrEdit,
        reloadAfterSubmit: true

    };  

var addParameters = {
        useFormatter: true,
        defaultValue: "",
        useDefValues: true,
        initdata: { tableName: t_Name },
        addRowParams: editOptions,
        reloadAfterSubmit: true  };      

var inlineParameters = {
        edit: false,
        editicon: "ui-icon-pencil",
        save: false,
        saveicon: "ui-icon-disk",
        cancel: false,
        cancelicon: "ui-icon-cancel",
        add: true,
        addicon: "ui-icon-plus",
        addParams: addParameters,
        editParams: editOptions,
        reloadAfterSubmit: true,
        restoreAfterSelect: false            
    };


jQuery("#list").jqGrid('navGrid', '#pager', { view: true, edit: true, add: false, del: false, refresh: true, search: true }, editOptions, addParameters, {}, searchOptions, viewOptions);

jQuery("#list").jqGrid('inlineNav', '#pager', inlineParameters);

jQuery("#list").jqGrid('filterToolbar', {
        stringResult: true, searchOnEnter: false, defaultSearch: "cn",
        beforeSearch: function() {
            $("#list").setGridParam({ postData: { _search: true, tableName: t_Name } });
        }    
    });

jQuery("#list").jqGrid('addRow', {
        useFormatter: true,
        useDefValues: true,
        initdata: { tableName: t_Name },
        addRowParams: addParameters
    });

これは私のコントローラーです

public JsonResult GridSaveAction(string id, jqGridMapTableModel MapRecord, string tableName, FormCollection formCollection, string someVal)
    {
        //Does some things
        try
        {                
          //Sets up update 
          success = DataAccessObject.Update(Query, myParameters); //Runs the update and returns true if success or false if it failed

        }
        catch (Exception ex) {
             return Json(ex.Message);    
        } 
        return Json(success ? "Operation succesful." : "Operation failed.");
    }

私は見つけることができるすべてを試してきましたが、何も機能せず、コードの一部が間違っていると思います。

どんな助けでも大歓迎です!

4

2 に答える 2

2

ついにパズルの欠けている部分を見つけました!インライン編集と[アクションボタン]列を使用する場合、onSuccesssonErrorafterSave関数をグリッドの列モデルにハードコーディングする必要があります。

私の場合、グリッドの[アクション]列を使用して、ボタンで編集機能を格納していました。これは、インライン編集を可能にする鉛筆アイコンの付いたボタンです。

この列はを使用し、formatter = "actions"を持っていEditActionIconsColumn = trueます。私は定義する必要がありました

formatoptions ={
afterSave: function (rowid) { $("#grid").trigger("reloadGrid"); }, 
...
}

これらはすべて、「アクション」列の列モデルでのみ定義されています。

jQGridスクリプトは、これらのボタンを使用してインライン編集を行うときにこれらのメソッドのみを使用し、この機能を設定した可能性のある他の場所を無視します。

それでおしまい。他の複雑なコードや、インライン保存機能の手動コーディングはありません。他のコードは、onErrorやonSuccessなどの他の機能と同様にここに実装できます。

于 2013-02-26T20:11:08.323 に答える
0

Jsonメッセージを返す例外を処理しているため、「actionErrorFunc」は呼び出されていません。例外をスローして、関数が起動するかどうかを確認してください。

サンプルは次のとおりです。

private ActionResult ReturnJson(String msg)
{
    Response.StatusCode = (Int32)HttpStatusCode.BadRequest;
    return Content(msg, MediaTypeNames.Text.Plain);
}

public ActionResult Delete(Int32 id)
{
    string success = "ok";
    try
    {
        //code to delete         
    }
    catch (Exception ex)
    {
        return ReturnJson(ex.Message);
    }
    return Json(success);
}
于 2013-01-10T01:45:47.263 に答える