Asp.net mvc 4 Kendo MVC网格在创建子记录时未将父ID传递给ClientID模板

Asp.net mvc 4 Kendo MVC网格在创建子记录时未将父ID传递给ClientID模板,asp.net-mvc-4,kendo-ui,kendo-grid,Asp.net Mvc 4,Kendo Ui,Kendo Grid,在分层网格中添加子记录时遇到问题。它不会从网格中的父级传递HeaderId 有人能发现问题吗,或者我正在尝试做一些不可能的事情吗? 谢谢 以下是控制器操作: [AcceptVerbs(HttpVerbs.Post)] public ActionResult BillDetail_Create(BillDetail billDetail, int billHeaderId) { if (billHeaderId == 0)

在分层网格中添加子记录时遇到问题。它不会从网格中的父级传递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>
@(Html.Kendo().Grid())
.名称(“票据抬头”)
.列(列=>
{
columns.Bound(h=>h.BillHeaderId);
columns.Bound(h=>h.Category);
columns.Bound(h=>h.Description);
columns.Bound(h=>h.Amount);
})
.Pageable()
.可选(可选=>可选
.Mode(GridSelectionMode.Multiple)
.Type(GridSelectionType.Row))
.DataSource(DataSource=>DataSource
.Ajax()
.页面大小(6)
.Events(Events=>Events.Error(“错误处理程序”))
.Read(Read=>Read.Action(“BillHeaders\u Read”,“Bill”))
)
.Events(Events=>Events.DataBound(“DataBound”))
.ClientDetailTemplateId(“BillDetails”)
)
@(Html.Kendo().Grid())
.Name(“BillDetails_35;=BillHeaderId#”)
.列(列=>
{
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();
}).宽度(75);
})
.DataSource(DataSource=>DataSource
.Ajax()
.页面大小(10)
.Model(Model=>
{
model.Id(d=>d.BillDetailId);
model.Field(d=>d.BillDetailId).可编辑(false);
})
.Events(Events=>Events.Error(“错误处理程序”))
.Read(Read=>Read.Action(“BillDetails_Read”,“Bill”,new{billHeaderId=“#=billHeaderId#“}))
.Update(Update=>Update.Action(“BillDetail\u Update”,“Bill”))
**.Create(Create=>Create.Action(“BillDetail_Create”,“Bill”,new{billHeaderId=“#=billHeaderId#“}))**
.Destroy(Destroy=>Destroy.Action(“BillDetail\u Destroy”,“Bill”))
.Pageable()
.ToolBar(tools=>tools.Create())
.ToClient模板()
)

终于解决了这个问题。真是难以置信

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

So控制员:

        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")))

终于解决了这个问题。真是难以置信

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

So控制员:

        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")))

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


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

要更好地解释为什么这样做有效:


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

谢谢你,大卫。我遇到了同样的问题,并将命名参数更改为id解决了这个问题。谢谢David。我遇到了同样的问题,并将命名参数更改为id修复了该问题。