With some help from the forums and some trial and error I have created an editor that works just fine for complex objects when they are in a kendo grid.
i.e. when I have a complex object as a column in a grid this editor will edit the object and populate the complex object on the post back to the controller
However, when I am trying to use this editor in a web form ("Ajax.BeignForm") and do my post back I get an error along the lines of "The parameter conversion from type 'System.String' to type 'X' failed because no type converter can convert between these types".
- Why does this work just fine for grids, but not forms? (I'm guessing grids do some "magic" that handles the casting)
- Are there any options for having a DropDownList or similar control update a complex object instead of just a hidden string field?
@using System.Text.RegularExpressions;@model object@{ Dictionary<string, object> metaData = ViewData.ModelMetadata.AdditionalValues; ListType? ListType_DataAnnotation = (ListType?)(metaData.ContainsKey("ListType") ? metaData["ListType"] : null); string Param1_DataAnnotation = (string)(metaData.ContainsKey("Param1") ? metaData["Param1"].ToString() : null); string Param2_DataAnnotation = (string)(metaData.ContainsKey("Param2") ? metaData["Param2"].ToString() : null); string Param3_DataAnnotation = (string)(metaData.ContainsKey("Param3") ? metaData["Param3"].ToString() : null); bool? ShowLabel_DataAnnotation = (bool)(metaData.ContainsKey("ShowLabel") ? metaData["ShowLabel"] : false); string ParamFunction_DataAnnotation = (string)(metaData.ContainsKey("ParamFunction") ? metaData["ParamFunction"].ToString() : null); ListType? ListType_VD = (ListType?)ViewData["ListType"]; string Param1_VD = (string)ViewData["Param1"];// ?? Param1_DataAnnotation; string Param2_VD = (string)ViewData["Param2"];// ?? Param2_DataAnnotation; string Param3_VD = (string)ViewData["Param3"];// ?? Param3_DataAnnotation; bool? ShowLabel_VD = (bool?)ViewData["ShowLabel"]; string ParamFunction_VD = (string)ViewData["ParamFunction"];// ?? ParamFunction_DataAnnotation; ListType ListType = (ListType)(ListType_VD ?? ListType_DataAnnotation); //one of these will always have a value in them string Param1 = Param1_VD ?? Param1_DataAnnotation; string Param2 = Param2_VD ?? Param2_DataAnnotation; string Param3 = Param3_VD ?? Param3_DataAnnotation; bool ShowLabel = (ShowLabel_VD ?? false) || (ShowLabel_DataAnnotation ?? false); string ParamFunction = ParamFunction_VD ?? ParamFunction_DataAnnotation; string uniqueName = Regex.Replace(Guid.NewGuid().ToString(), "[^A-Za-z]+", ""); string ID = (string)ViewData["ID"]; ID = ID ?? uniqueName; string DataTextField = ListService.GetDataTextField(ListType); string DataValueField = ListService.GetDataValueField(ListType); }@if(ShowLabel){ @Html.LabelFor(x => x)}@(Html.Kendo().DropDownListFor(x => x) .DataTextField(DataTextField) .DataValueField(DataValueField) .Filter(FilterType.Contains) .DataSource(source => { source.Read(read => { if (ParamFunction == null || ParamFunction.Length == 0) { read.Action("Read", "List", new { ListType = ListType, Param1 = Param1, Param2 = Param2, Param3 = Param3 }); } else { read.Action("Read", "List").Data(ParamFunction); } }); }) )