Kendo Grid:外键下拉菜单在更新后不更新网格单元格

Posted

技术标签:

【中文标题】Kendo Grid:外键下拉菜单在更新后不更新网格单元格【英文标题】:Kendo Grid: Foreign Key Dropdown does not update grid cell after update 【发布时间】:2013-11-12 20:04:03 【问题描述】:

我有一个 Kendo MVC 网格,其中包含一个可空属性(短),该属性绑定为外键并使用下拉列表作为编辑器模板。我也在使用内联编辑。

当属性值为 null 时,单击更新按钮后,下拉列表选择值不会设置到网格单元格中。如果使用 incell 编辑,这可以正常工作。我正在寻找可以解决我的问题的解决方法。我在下面包含了我的代码的精简版本

如果可空值设置为非空值,则一切正常。

网格

@(html.Kendo().Grid<AssetViewModel>()
   .Name("DealAssets")
   .Columns(c =>
   
      c.Bound(x => x.Name);
      c.ForeignKey(x => x.AssetTypeID, (IEnumerable<SelectListItem>)ViewBag.AssetTypeList, "Value", "Text");
      c.ForeignKey(x => x.SeniorityTypeID, seniorityTypeList, "Value", "Text").EditorTemplateName("GridNullableForeignKey");
      c.ForeignKey(x => x.RateBaseID, rateBaseList, "Value", "Text").EditorTemplateName("GridNullableForeignKey"); ;
      c.Command(m =>  m.Edit(); m.Destroy(); );
   )
   .ToolBar(toolbar => toolbar.Create().Text("Add New Asset"))
   .Editable(x => x.Mode(GridEditMode.InLine))
   .DataSource(ds => ds
      .Ajax()
      .Model(model => model.Id(request => request.ID))
      .Read(read => read.Action("ReadAssets", "Deal", new  id = Model.ID ))
      .Create(create => create.Action("CreateAsset", "Deal", new  currentDealID = Model.ID ))
      .Update(update => update.Action("UpdateAsset", "Deal"))
      .Destroy(destroy => destroy.Action("DeleteAsset", "Deal"))
   )
)

编辑器模板

@model short?
@
   var controlName = ViewData.TemplateInfo.GetFullHtmlFieldName("");

@(
   Html.Kendo().DropDownListFor(m => m)
      .Name(controlName)
      .OptionLabel("- Please select -")
      .BindTo((SelectList)ViewData[ViewData.TemplateInfo.GetFullHtmlFieldName("") + "_Data"])
)

更新操作

public ActionResult UpdateAsset([DataSourceRequest] DataSourceRequest request, int ID)

   var dealAsset = DataContext.DealAssets.SingleOrDefault(o => o.ID == ID);
   if (dealAsset != null)
   
      if (TryUpdateModel(dealAsset.Asset, new[] "Name","AssetTypeID","SeniorityTypeID","RateBaseID" ))
      
         DataContext.SaveChanges();
      
   
   return Json(new[]  new AssetViewModel(dealAsset) .ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);

【问题讨论】:

【参考方案1】:

Telerik 最近刚刚在他们的选择列表中添加了一个新的 HTML 属性 data_value_primitive,以解决上述问题。应该在外键编辑器模板中添加新属性并设置为 true。

 Html.Kendo().DropDownListFor(m => m)
        .Name(controlName)
        .OptionLabel("- Please select -")
        .BindTo((SelectList)ViewData[ViewData.TemplateInfo.GetFullHtmlFieldName("") + "_Data"])
        **.HtmlAttributes(new  data_value_primitive = true)**

最后一部分是对 update 方法的修改,以说明网格在执行 ajax 调用时不会传回 null 属性。我认为这更多地与 TryUpdateModel 方法的工作方式有关

...
if (TryUpdateModel(dealAsset.Asset, new[] "Name","AssetTypeID","SeniorityTypeID","RateBaseID" ))

   // If no property passed back then set it to null
   var senorityTypeID = ValueProvider.GetValue("SeniorityTypeID");
   if (senorityTypeID == null)
   
      dealAsset.Asset.SeniorityTypeID = null;
    else 
      dealAsset.Asset.SeniorityTypeID = (short)senorityTypeID.ConvertTo(typeof(short));
   
   var rateBaseID = ValueProvider.GetValue("RateBaseID");
   if (rateBaseID == null)
   
      dealAsset.Asset.RateBaseID = null;
    else 
      dealAsset.Asset.RateBaseID = (byte)rateBaseID.ConvertTo(typeof(byte));
   
   DataContext.SaveChanges();

'''

【讨论】:

+1。你只是让我头疼!只有一件事,如果我将它包含在GridForeignKey.cshtml 模板中,是否会导致其他不可为空的字段出现问题? 我不确定。如果您确实对不可为空的字段有疑问,您可以在模型上使用 UIHint 属性来分配要使用的特定编辑器模板。

以上是关于Kendo Grid:外键下拉菜单在更新后不更新网格单元格的主要内容,如果未能解决你的问题,请参考以下文章

从下拉列表中选择选项后,Kendo UI Grid 中的下拉菜单显示对象-对象

Kendo Grid 如何更新、创建、删除数据源

Kendo Grid 可过滤单元格

Telerik Kendo Grid (MVC) 更新后刷新

Kendo Grid 在单元格编辑后更新所有行

更新 ViewModel 时如何防止 Kendo UI Grid 多次重新绑定