3

このトピックでダニエルが抱えていたのと同じ問題がありますが、彼の解決策はうまくいきません。

http://www.kendoui.c​​om/forums/ui/grid/kendo-ui-grid-inserts-updates-create-duplicate-records.aspx#-jhxqRrNAUGsTFJaC-Ojwg

だからユースケース。ユーザーは 2 つの新しいレコードを次々に追加します。

  1. グリッドの「新規レコード追加」ボタンを押す
  2. フィールドに入力します (name="Alex"、amount=10、comment="first")。
  3. レコード 1 の準備ができました。「保存」を押します。(データはコントローラに送信され、データベースに送信されます)
  4. ユーザーはグリッドに 1 つのレコードを表示します

  5. もう一度「新しいレコードを追加」ボタンを押します

  6. フィールドに入力します (name="Bob"、amount=20、comment = "second")。
  7. レコード 1 の準備ができました。「保存」を押します。データはコントローラに送信され、データベースよりも送信されます。この瞬間に何かが起こり、グリッドは Ajax リクエストをレコード 1 のデータとともにコントローラーに再度送信します。

  8. ユーザーがグリッドを更新し、3 つのレコードを表示する

    「アレックス | 10 | 最初」 (重複レコード) ID = 1

    「ボブ | 20 | 秒」 ID = 2

    「アレックス | 10 | 最初」 ID = 1

彼らは、新しいレコードでデータ ソースを正しくバインド/更新するために ID を返すことを推奨しています。そして、それを返します (データベースからの新しい ID は、bouns エンティティに応答して返されます)! これは役に立ちません。最初のレコードを追加してF5でページを更新し、その後2番目のレコードを追加した場合にのみ、すべて問題ありません。しかし、別のものを追加すると、3番目のレコード - 問題が再び発生します

コントローラーのコード:

[HttpPost]
    public JsonResult Create(BonusDto bonusDto)
    {
        BonusAggregate bonus;

        if (bonusDto.Amount <= 0)
            throw new ArgumentOutOfRangeException("Amount should be more than 0");

        if (bonusDto.EmployeeId <= 0)
            throw new ArgumentNullException("You should specify an existing employee");

        using (var dbContext = new DatabaseContext())
        {
            BonusesRepository = new BonusesRepository(dbContext);
            var employeeRepository = new EmployeesRepository(dbContext);
            bonus = new BonusFactory(employeeRepository).Create(bonusDto);

            BonusesRepository.Save(bonus);
        }

        HttpContext.Response.StatusCode = (int)HttpStatusCode.Created;
        return Json(bonus); // try to return ID after bonus was saved
    }

UI コード

// creates bonuses grid control
$("#bonusesGrid").kendoGrid({
    dataSource: bonusesDataSource,
    toolbar: ["create"],
    editable: "inline",
    columns: [
        "BonusId",
        "EmployeeId",
        {
            field: "EmployeeLastName",
            editor: employeeAutocompletingEditor,
            template: "#=EmployeeLastName#"
        },
        "Amount",
        {
            field: "Comment",
            titel: "Comment",
            editor: textareaEditor,
            filterable: {
                operators: {
                    number: {
                        contains: "Contains"
                    }
                }
            }
        },
        {
            command: ["edit"],
            title: " "
        }
    ],
    save: function(e) {
        if (newValueEmployeeId !== undefined && 
                            newValueEmployeeLastName !== undefined && 
                            newValueEmployeeLastName !== "") {
                              setNewValueEmployeeIdAndLastName(newValueEmployeeId, newValueEmployeeLastName);
                              gridDataSource.model.EmployeeId = newValueEmployeeId; // it's a hack to bind model and autocomplete control
                              gridDataSource.model.EmployeeLastName = newValueEmployeeLastName;
                        } else {
                              gridDataSource.model.EmployeeId = currentValueEmployeeId;
                              gridDataSource.model.EmployeeLastName = currentValueEmployeeLastName;

                        }
    },
    edit: function(e) {
        setCurrentValueEmployeeIdAndLastName(e.model.EmployeeId, e.model.EmployeeLastName);
    },
    cancel: function(e) {
        setCurrentValueEmployeeIdAndLastName(e.model.EmployeeId, e.model.EmployeeLastName);
    }
});

ボーナス データ ソース:

// bind json result from /Bonuses/GetPagedJsonBonuses
        var bonusesDataSource = new kendo.data.DataSource({
                transport: {

                    read: {
                         url: "@Url.Action("GetPagedJsonBonuses", "Bonuses")",
                         type : "GET",
                         contentType: "application/json",
                         dataType: "json",
                         cache: false
                    },
                    create: {
                        url: "@Url.Action("Create", "Bonuses")",
                        dataType: "json",
                        type: "POST"
                    },
                    parameterMap: function(options, operation) {
                        if (operation === "update" || operation === "create") {

                            // correct format for conversion 
                            var d = new Date(options.Date);
                            options.Date = kendo.toString(d, dateFormat);

                            // updates the BonusDTO.EmployeeId with selected value
                            if (newValueEmployeeId !== undefined)
                                options.EmployeeId = newValueEmployeeId;
                        }
                        if(operation === "read") {
                            options.filter = setFormattedFilterDate(options.filter);
                        }
                        return options;
                    }
                },
                pageSize: 15,
                serverPaging: true,
                serverSorting: true,
                serverFiltering: true,
                error: showErrorMessage,
                schema: {
                    data: "Data", // PagedResponse.Data
                    total: "TotalCount", // PagedResponse.TotalCount
                    model: {
                        id: "BonusId",  // Data
                        fields: {
                            EmployeeId: { type: "number" },
                            EmployeeLastName: {
                                type: "string",
                                editable: true,
                                nulable: false,
                                validation: { required: {message: "Employee's last name is required"}}
                            },
                            Date: {
                                type: "date",
                                editable: true,
                                nullable: false,
                                validation: {
                                    required: { message: "Date is required to be set" }
                                }
                            },
                            Amount: {
                                type: "number",
                                editable: true,
                                nullable: false,
                                defaultValue: 1,
                                validation: {
                                    required: { message: "Amount is required to be set" }
                                }
                            },
                            Comment: { type: "string", editable: true }
                        } // fields
                    } // model
                }// schema 
            });
4

8 に答える 8

11

私のコードではこの問題は見られませんでした。ただし、グリッドを更新する作成および更新イベントに「完全な」イベントハンドラーがあります-それはあなたを助けるかもしれません:

  dataSource: {

    type: "jsonp",
    transport: {
        read: UrlBase + "getAll",
        update: {
            url: UrlBase + "Update",
            dataType: "jsonp",
            complete: function (e) {
                $("#grid").data("kendoGrid").dataSource.read();

            }
        },
        create: {
            url: UrlBase + "create",
            dataType: "jsonp",
            complete: function (e) {
                $("#grid").data("kendoGrid").dataSource.read();
            }
        },
        destroy: {
            url: UrlBase + "destroy",
            dataType: "jsonp",
            complete: function (e) {
                $("#grid").data("kendoGrid").dataSource.read();
            }
        }
    },
   ...
于 2013-05-04T11:49:00.800 に答える
6

はい、ハメドは正しいです。「作成」アクションの結果は、データベースに保存されるモデルからオブジェクトを渡します。データ アクセス レイヤーの INSERT に、データベースで新しく作成されたキー ("ID") を返すようにします。このキーを使用して、アクションの結果に渡され、JSON としてビューに返されるモデルの「ID」フィールドを設定します。これで、グリッドはこのレコードを作成したばかりで、それ以上何もする必要がないことを認識します。それ以外の場合、モデル オブジェクトは「ID」フィールドが 0 に設定された状態で返されるため、グリッドはこのレコードを追加する必要があると判断します。

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Grid_Create([DataSourceRequest] DataSourceRequest request, MyObject obj)
    {
        if (obj != null && ModelState.IsValid)
        {
            obj.Id = _myService.Create(obj);
        }

        return Json(new[] { obj }.ToDataSourceResult(request, ModelState));
    }
于 2014-06-16T13:38:33.603 に答える
3

このエラーは、読み取りアクションでビューに主キーを渡さなかった場合に発生します。

よろしく

于 2014-02-04T12:21:41.873 に答える
2

Quinton Bernhardt の complete イベントの代替: dataSource.read() を剣道同期イベントにバインドします。

同期イベントを公開しない剣道の C# MVC の html ヘルパーを使用しているため、グリッドを設定した後に変更する必要がありました。

ウィンドウのロード時:

var grid = $("#GridName").data("kendoGrid");
grid.dataSource.bind("sync", function () {
     $("#GridName").data("kendoGrid").dataSource.read();
});

同期イベントは、保存要求が完了した後に発生します。dataSource.read()は、サーバー側で設定された ID を含め、サーバーから最新のものを取得します。

于 2014-09-24T16:50:18.787 に答える
2

同様の問題があり、さまざまな試行を行いましたが、次の試行で修正されました

Jクエリ

   create: {
                type: "POST",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                url: "../../ajax/ajaxGv.aspx/addstaff"
            },

            parameterMap: function (options, operation) {
                if (operation == "create" && options.models) {  
                    return JSON.stringify({ "oStaff": options.models });
                }

VB.Net

   'Adding Staff
   <System.Web.Services.WebMethod()> _
 Public Shared Sub addStaff(ByVal oStaff As Object)
    Dim strJson As String = JsonConvert.SerializeObject(oStaff)
    Dim lstStaff As List(Of Staff) = JsonConvert.DeserializeObject(Of List(Of Staff))(strJson)
    Dim db As New LiveB2cDataContext
    Try

            db.Staff.InsertAllOnSubmit(lstStaff)
        Next
        db.SubmitChanges()

      'Fix is that you need to return the objects you have added in the database back as json to kendo

        strJson = JsonConvert.SerializeObject(lstStaff, Formatting.None)
        WriteJson(strJson) ' Returning the objects added as json back to Kendo
    Catch ex As Exception
        ErrorLog(ex)
    End Try

End Sub

Public Shared Sub WriteJson(strJson As String)
    Try

        HttpContext.Current.Response.Write(strJson)
        HttpContext.Current.Response.Flush()
        HttpContext.Current.ApplicationInstance.CompleteRequest()
        HttpContext.Current.Response.SuppressContent = True

    Catch ex As Exception
        ErrorLog(ex)
    End Try
End Sub

Fix is that you need to return the objects you have added in the database back as json to kendo

于 2015-06-17T10:38:16.030 に答える
0

これが問題の一部であるかどうかはわかりませんが、DataSource のスキーマ モデルで、ID が「BonusId」という名前のフィールドであることを指定していますが、そのフィールドはフィールドの配列で指定されていません。

于 2013-05-04T18:56:35.667 に答える
0

私は同様の問題を抱えていました。

私はそれを修正しましたが、モデルのIDがフィールドを参照していることを確認してください:-

model: {
      id: "Id",
      fields: {
           Id: { editable: false, type: "number" },
           AnotherName: { editable: true, type: "string" },
           AnotherId: { editable: true, type: "number" }
           }
      }
于 2014-06-25T12:59:33.980 に答える