2013-11-01 72 views
3

我有一个Kendo MVC网格,它包含一个绑定为外键并将下拉列表用作编辑器模板的可空属性(简称)。我也在使用内联编辑。Kendo Grid:更新后外键下拉不更新网格单元

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

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

GRID

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

EDITOR模板

@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); 
} 

回答

10

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})** 

最后一节是一个修改更新的方法来解释这样做的Ajax调用当电网未传回空的属性。我认为这与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(); 
} 
''' 
+0

+1。你刚刚救了我头痛!只有一件事,如果我将它包含在'GridForeignKey.cshtml'模板中,是否会导致其他非空字段的问题? – 1nfected

+0

我不确定。如果您在使用非空字段时遇到问题,则可以在模型上使用UIHint属性来指定要使用的特定编辑器模板。 –