创建子记录时,Kendo MVC Grid未将父ID传递给ClientID模板

时间:2013-08-01 15:49:03

标签: asp.net-mvc-4 kendo-ui kendo-grid

我在分层网格中添加子记录时遇到问题。它不会从网格中的父级传递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>

2 个答案:

答案 0 :(得分:5)

管理以最终修复此问题。难以置信真的......

我将控制器(和视图)中的参数命名为“ id

所以控制器:

        public ActionResult BillDetail_Create(BillDetail billDetail, int id)

观看:

        .Read(read => read.Action("BillDetails_Read", "Bill", new { id = "#=BillHeaderId#" }))
        .Update(update => update.Action("BillDetail_Update", "Bill"))
        .Create(create => create.Action("BillDetail_Create", "Bill", new { id = "#=BillHeaderId#" }))
        .Destroy(destroy => destroy.Action("BillDetail_Destroy", "Bill")))

答案 1 :(得分:1)

为了更好地解释为什么有效:

如果BillDetail类具有相同名称的属性,则会发生这种情况。在这种情况下,MVC模型绑定器将覆盖与请求路由值一起发送的值,其值作为网格模型的表单数据发送。如果是这种情况,那么避免问题的最简单方法是重命名参数。这就是重命名为ID工作的原因。