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