1

階層グリッドに子レコードを追加する際に問題が発生しています。グリッド内の親から HeaderId は渡されません。

誰でも問題を見つけることができますか、または私は不可能なことをしようとしていますか? ありがとう。

コントローラーのアクションは次のとおりです。

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult BillDetail_Create(BillDetail billDetail, int billHeaderId)
        {
            if (billHeaderId == 0)
            {
                ModelState.AddModelError("billHeaderID", "add bill header first");
            }
            if (billDetail != null && ModelState.IsValid)
            {
                var target = new BillDetail
                {
                    Category = billDetail.Category,
                    Description = billDetail.Description,
                    Amount = billDetail.Amount,
                    BillHeaderId = billHeaderId,
                    BillDetailId = SessionBillDetails.Max(d => d.BillDetailId) + 1
                };

                //Get next Id in sequence

                billDetail.BillDetailId = target.BillDetailId;

                SessionBillDetails.Add(target);
            }

            return Json(new[] { billDetail }.ToDataSourceResult(new DataSourceRequest(), ModelState));
        }

そして、ここにビューがあります:

@(Html.Kendo().Grid<BillHeader>()

    .Name("BillHeaders")
    .Columns(columns =>
    {
        columns.Bound(h => h.BillHeaderId);
        columns.Bound(h => h.Category);
        columns.Bound(h => h.Description);
        columns.Bound(h => h.Amount);
    })
    .Pageable()
    .Selectable(selectable => selectable
            .Mode(GridSelectionMode.Multiple)
            .Type(GridSelectionType.Row))
    .DataSource(dataSource => dataSource
        .Ajax()
        .PageSize(6)
        .Events(events => events.Error("error_handler"))
        .Read(read => read.Action("BillHeaders_Read", "Bill"))
    )
    .Events(events => events.DataBound("dataBound"))
    .ClientDetailTemplateId("BillDetails")

      )

<script id="BillDetails" type="text/kendo-tmpl">
    @(Html.Kendo().Grid<BillDetail>()
          .Name("BillDetails_#=BillHeaderId#")
          .Columns(columns =>
          {
              columns.Bound(d => d.BillHeaderId).Width(50);
              columns.Bound(d => d.BillDetailId).Width(70);
              columns.Bound(d => d.Category).Width(70);
              columns.Bound(d => d.Description).Width(150);
              columns.Bound(d => d.Amount).Width(80);
              columns.Command(command =>
              {
                  command.Edit();
                  command.Destroy();
              }).Width(75);
          })
          .DataSource(dataSource => dataSource
              .Ajax()
              .PageSize(10)
              .Model(model =>
              {
                  model.Id(d => d.BillDetailId);
                  model.Field(d => d.BillDetailId).Editable(false);
              })
            .Events(events => events.Error("error_handler"))
            .Read(read => read.Action("BillDetails_Read", "Bill", new { billHeaderId = "#=BillHeaderId#" }))
            .Update(update => update.Action("BillDetail_Update", "Bill"))
            **.Create(create => create.Action("BillDetail_Create", "Bill", new { billHeaderId = "#=BillHeaderId#" }))**
            .Destroy(destroy => destroy.Action("BillDetail_Destroy", "Bill")))

          .Pageable()
          .ToolBar(tools => tools.Create())
          .ToClientTemplate()
          )
</script>
4

2 に答える 2

1

それがうまくいった理由のより良い説明のために:

これは、BillDetail クラスに同じ名前のプロパティがある場合に発生する可能性があります。この場合、MVC モデル バインダーは、リクエスト ルート値で送信された値を、グリッド モデルのフォーム データとして送信された値でオーバーライドします。この場合、問題を回避する最も簡単なオプションは、パラメーターの名前を変更することです。そのため、ID への名前変更が機能しました。

于 2014-07-17T13:29:01.627 に答える