2013-08-01 33 views
1

我在添加子级记录时出现问题。它不会从网格中的父级传递HeaderId。当创建子记录时,Kendo MVC Grid未将父ID传递给ClientID模板

任何人都可以发现一个问题,或者我想做的事情是不可能的吗? 谢谢。

这里的控制器动作:

[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> 

回答

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

谢谢大卫。我遇到了同样的问题,并更改命名参数为id解决了问题。 – ajexpress

1

为了更好地解释为什么工作:

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

相关问题