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

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")))
于 2013-08-02T11:29:11.443 回答
1

为了更好地解释为什么会这样:

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

于 2014-07-17T13:29:01.627 回答