如何在(asp.net)自定义服务器控件中维护状态?

时间:2010-08-10 08:51:21

标签: asp.net controls

我正在尝试创建一个继承自DropDownList的自定义服务器控件。我给控件一个包含一些键/值对的XML输入,我的控件将它们显示为DropDownList。 我在覆盖渲染方法中创建列表项,如下所示:

foreach (XElement child in root.Elements("Choice"))
{
    string title = child.Element("Title").Value;
    string score = child.Element("Score").Value;
    item = new ListItem();
    item.Text = title;
    item.Value = score;

    this.Items.Add(item);
}

问题在于,当用户选择列表中的项目并且页面回发时,所选项目将丢失,并使用默认数据重新初始化列表。

有没有人知道如何保留所选项目,即保持状态?

以下是完整的来源:

public class MultipleChoiceQuestionView2 : DropDownList

{  public MultipleChoiceQuestionView2()   :base()  {  }

protected override void Render(HtmlTextWriter writer)  {   writer.RenderBeginTag(HtmlTextWriterTag.Table);   writer.RenderBeginTag(HtmlTextWriterTag.Tr);

writer.RenderBeginTag(HtmlTextWriterTag.Td);   #region Parse Contets   if(!String.IsNullOrEmpty(this.Contents))   {    XElement root = XElement.Parse(this.Contents);

if(root.HasAttributes)    {     this.NoOfChoices = Int32.Parse(root.Attribute(“ItemCount”)。Value);    }

this.Items.Clear();    this.Style.Add(“width”,“100px”);    this.Style.Add(“font-family”,“Tahoma”);    this.Items.Clear();    ListItem item = new ListItem();    item.Text =“”;    item.Value =“0”;    this.Items.Add(项目);

foreach(root.Elements中的XElement子元素(“Choice”))    {     string title = child.Element(“Title”)。Value;     string score = child.Element(“Score”)。值;     item = new ListItem();     item.Text = title;     item.Value =得分;

this.Items.Add(item);

}   }   #endregion   base.Render(作家);   writer.RenderEndTag();

if(this.Required)   {    RequiredFieldValidator rfv = new RequiredFieldValidator();    rfv.ControlToValidate = this.ID;    rfv.InitialValue =“0”;    rfv.Text =“*”;    if(!String.IsNullOrEmpty(this.ValidationGroup))    {     rfv.ValidationGroup = this.ValidationGroup;    }    writer.RenderBeginTag(HtmlTextWriterTag.Td);    rfv.RenderControl(作家);    writer.RenderEndTag();   }

writer.RenderEndTag();   writer.RenderEndTag();  }  #region属性  公共字符串内容  {   得到   {    return ViewState [“Contents”] == null? “”:ViewState [“Contents”]。ToString();   }   组   {    ViewState [“Contents”] = value;   }  }

private int mNoOfChoices;  public int NoOfChoices  {   得到{return mNoOfChoices; }   设置{mNoOfChoices = value; }  }

private string mValidationGroup;  公共字符串ValidationGroup  {   get {return mValidationGroup; }   设置{mValidationGroup = value; }  }

public string SelectedChoice  {   得到   {    返回“”;   }  }

private bool mRequired = false;  public bool必填  {   得到{return mRequired; }   set {mRequired = value; }  }

#endregion }

提前致谢。

1 个答案:

答案 0 :(得分:2)

您有两种选择:ViewStateControlState

可以通过在页面指令中设置EnableViewState="false"来覆盖ViewState的区别,而ControlState则不能。

当您获取/设置下拉列表的值时,基本上您需要挂钩状态包

有一个不错的示例here,其中自定义控件派生自Button类并维护页面请求之间的状态 - 应该很好地适合您的场景。

希望这能让你开始。