Widget with a custom designer and string[] property
Hi.
How can I manage widget string[] property by a custom designer? I've tried to do following:
Widget:
[Telerik.Sitefinity.Web.UI.ControlDesign.ControlDesigner(typeof(TextControlDesigner))] public class TextControl : TextControlBase private const string TemplateName = "Controls.Resources.Templates.TextControl.ascx"; protected override void InitializeControls(GenericContainer container) TextBox1.Text = this.Text; if (this.Test != null) TextBox2.Text = this.Test[0]; public string Text get; set; public string[] Test get; set; protected override string LayoutTemplateName get return TemplateName; protected virtual TextBox TextBox1 get return base.Container.GetControl<TextBox>("TextBox1", true); protected virtual TextBox TextBox2 get return base.Container.GetControl<TextBox>("TextBox2", true); <%@ Control Language="C#" %><asp:TextBox runat="server" ID="TextBox1" /><asp:TextBox runat="server" ID="TextBox2" />public class TextControlDesigner : ControlDesignerBase private const string TemplateName = "Controls.Resources.Templates.TextControlDesigner.ascx"; private const string ScriptReference = "Controls.Resources.JavaScript.TextControlDesigner.js"; protected override void InitializeControls(GenericContainer container) base.DesignerMode = ControlDesignerModes.Simple; protected override string LayoutTemplateName get return TemplateName; public override IEnumerable<System.Web.UI.ScriptReference> GetScriptReferences() var res = new List<ScriptReference>(base.GetScriptReferences()); var assemblyName = this.GetType().Assembly.GetName().ToString(); res.Add(new ScriptReference(ScriptReference, assemblyName)); return res.ToArray(); <%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sitefinity" %><%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %><div class="sfContentViews"> <div id="TextControlOptions"> <h2> Fine tune your Text control </h2> <div> <label for="text"> Text</label> <input type="text" id="text" class="sfTxt" /> <label for="test"> Text</label> <input type="text" id="test" class="sfTxt" /> </div> </div></div>Type.registerNamespace("Controls.Navigation");Controls.Navigation.TextControlDesigner = function (element) Controls.Navigation.TextControlDesigner.initializeBase(this, [element]); this._parentDesigner = null; this._googleAnalyticsCodeTextField = null; this._scriptEmbedPositionChoiceField = null; this._toogleGroupSettingsDelegate = null;Controls.Navigation.TextControlDesigner.prototype = initialize: function () this.refreshUI(); Controls.Navigation.TextControlDesigner.callBaseMethod(this, 'initialize'); this._toogleGroupSettingsDelegate = Function.createDelegate(this, function () dialogBase.resizeToContent(); ) , dispose: function () Controls.Navigation.TextControlDesigner.callBaseMethod(this, 'dispose'); , refreshUI: function () var data = this._propertyEditor.get_control(); jQuery("#text").val(data.Text); if ((data.Test !== null) && (typeof (data.Test) !== 'undefined')) jQuery("#test").val(data.Test[0]); , applyChanges: function () var controlData = this._propertyEditor.get_control(); controlData.Text = jQuery("#text").val(); controlData.Test = new Array(); controlData.Test[0] = '1'; Controls.Navigation.TextControlDesigner.registerClass('Controls.Navigation.TextControlDesigner', Telerik.Sitefinity.Web.UI.ControlDesign.ControlDesignerBase);if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();Error Status Code: 'InternalServerError'Details: There was an error deserializing the object of type Telerik.Sitefinity.Modules.Pages.Web.Services.Model.WcfControlProperty[]. End element 'PropertyValue' from namespace '' expected. Found element 'item' from namespace ''.Hi Vyacheslav,
Generally you should deserialize and serialize the object on the client using Sys.Serialization.JavaScriptSerializer
All the best,
Ivan Dimitrov
the Telerik team
Hi Ivan,
Thank you for your answer.
I've tried to do following at the designer's js code:
applyChanges: function () var controlData = this._propertyEditor.get_control(); controlData.Text = jQuery("#text").val(); var test = new Array(); test[0] = '1'; test[1] = '2'; console.log("test: %o", test); controlData.Test = Sys.Serialization.JavaScriptSerializer.serialize(test); console.log("serialized test: %o", Sys.Serialization.JavaScriptSerializer.serialize(test)); Controls.Converters using System; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Globalization; using Newtonsoft.Json; public class StringArrayConverter : TypeConverter public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType)); public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) return ((destinationType == typeof(InstanceDescriptor)) || base.CanConvertTo(context, destinationType)); public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) if (value is string) return JsonConvert.DeserializeObject<string[]>(value as string); return base.ConvertFrom(context, culture, value); public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) if (value is string[]) return JsonConvert.SerializeObject(value); return base.ConvertTo(context, culture, value, destinationType);