4

外部キーとしてバインドされ、ドロップダウン リストをエディター テンプレートとして使用する null 許容プロパティ (short) を含む Kendo MVC グリッドがあります。インライン編集も使用しています。

プロパティ値が null の場合、更新ボタンをクリックした後、ドロップダウン リストで選択した値がグリッド セルに設定されません。インセル編集が使用されている場合、これは正常に機能します。私の問題を解決する回避策を探しています。以下に、コードの簡略化されたバージョンを含めています

null 許容値が null 以外の値に設定されている場合、すべてが機能します。

グリッド

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

1 に答える 1

12

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 呼び出しを行うときにグリッドが null プロパティを返さないことを考慮して update メソッドを変更したものです。これは、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();
}
'''
于 2013-11-01T15:27:39.047 に答える