How to save the type of elements in the collection of the base type via postback?

I have a base class, a set of subclasses, and a collection container that I use to create and populate controls dynamically using partial views.

// base class
public class SQControl
{
    [Key]
    public int ID { get; set; }
    public string Type { get; set; }
    public string Question { get; set; }
    public string Previous { get; set; }
    public virtual string Current { get; set; }
}

// subclass
public class SQTextBox : SQControl
{
    public SQTextBox()
    {
        this.Type = typeof(SQTextBox).Name;
    }
}

//subclass
public class SQDropDown : SQControl
{
    public SQDropDown()
    {
        this.Type = typeof(SQDropDown).Name;
    }

    [UIHint("DropDown")]
    public override string Current { get; set; }
} 

// collection container used as the Model for a view
public class SQControlsCollection
{
    public List<SQControl> Collection { get; set; }
    public SQControlsCollection()
    {
        Collection = new List<SQControl>();
    }

}

I populate the Collection control with various subclasses of SQControl, as required at runtime, and in EditorTemplates I have a separate view for each subclass. Using Html.EditorFor for collection items, I can dynamically generate the form using the appropriate controls.

It all works great.

, MVC , , SQControl.

, .

, , - "" , , "".

public static SQControlsCollection Copy(SQControlsCollection target)
    {
        SQControlsCollection newCol = new SQControlsCollection();

        foreach (SQControl control in target.Collection)
        {
            if (control.Type == "SQTextBox")
            {
                newCol.Collection.Add(new SQTextBox { Current = control.Current, Previous = control.Previous, ID = control.ID, Question = control.Question });
            }
            else if (control.Type == "SQDropDown")
            {
                newCol.Collection.Add(new SQDropDown { Current = control.Current, Previous = control.Previous, ID = control.ID, Question = control.Question });
            }
            ...


        }

        return newCol;
    }

, : - postbacks? , MVC , " " XML- .

+3

All Articles