如何从Web Control类派生的JSON序列化类

时间:2011-05-24 19:03:08

标签: c# asp.net json serialization javascriptserializer

有没有人知道如何将自定义控件序列化为从另一个Web控件派生的JSON。我不断收到基类不可序列化的错误。这是派生类

的代码
public class BaseWidget : CompositeControl
{
    protected Label _lblHeader;
    protected Button _editButton;
    protected HtmlInputHidden _idField;

    /// <summary>
    /// The Unique identified that identifies this widget
    /// </summary>

    public int ControlID
    {
        get
        {
            EnsureChildControls();
            int i = -1;
            int.TryParse(_idField.Value, out i);
            return i;
        }
        set
        {
            EnsureChildControls();
            _idField.Value = value.ToString();
        }
    }

    /// <summary>
    /// Allow the user to edit the widget
    /// </summary>
    public bool AllowEdit
    {
        get;
        set;
    }


    public string Title
    {
        get
        {
            EnsureChildControls();
            return _lblHeader.Text;
        }
        set
        {
            EnsureChildControls();
            _lblHeader.Text = value;
        }
    }



    public string CallbackFunction
    {
        get;
        set;
    }


    protected Panel Header
    {
        get;
        set;
    }

    /// <summary>
    /// The Main Control of the widget
    /// </summary>
    protected Panel Content
    {
        get;
        set;
    }

    protected Panel Edit
    {
        get;
        set;
    }

    protected Panel Body
    {
        get;
        set;
    }

    /// <summary>
    /// The tag that the control is associated with
    /// </summary>
    protected override HtmlTextWriterTag TagKey
    {
        get
        {
            return HtmlTextWriterTag.Li;
        }
    }


    public BaseWidget()
    {
        this.ControlID = 0;
    }}

我实际上甚至不需要序列化基类中的任何属性。我只需要控制ID和序列化相关的标题。当Web Control不可序列化时,有没有办法做到这一点。我试过DataContractJsonSerializer和JavascriptSerializer没有运气,因为WebControl类不可序列化。

1 个答案:

答案 0 :(得分:1)

在DataContractJsonSerializer上,您可以定义代替控件的代理项(有关更多信息,请搜索IDataContractSurrogate)。但是,如果您只需要序列化这两个属性,那么您可以更简单地使用这些属性创建数据类(DTO?)并将其序列化。

public class BaseWidgetDTO
{
    public int ControlID { get; set; }
    public string Title { get; set; }
}