如何在(asp.net)自定义服务器控件中维护状态?
我试图做一个自定义的服务器控件从DropDownList继承。 我给控件一个包含一些键/值对的XML输入,我的控件将它们显示为DropDownList。 我在覆盖Render方法中做这样的列表项:
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(){}
保护覆盖无效渲染(HtmlTextWriter作家){writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td); #地区解析竞争如果(!String.IsNullOrEmpty(this.Contents)){XElement根= 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(项目);
(XElement child in root.Elements(“Choice”)){string title = child.Element(“Title”)。 string score = child.Element(“Score”)。Value; item = new ListItem(); item.Text = title; item.Value =分数;
this.Items.Add(item);
}} #endregion base.Render(writer); 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(); }#区域属性public string Contents {get {return ViewState [“Contents”] == null? “”:ViewState [“Contents”]。ToString(); } set {ViewState [“Contents”] = value; }}
private int mNoOfChoices; public int NoOfChoices {get {return mNoOfChoices; } set {mNoOfChoices = value; }}
私人字符串mValidationGroup; public string ValidationGroup {get {return mValidationGroup; } set {mValidationGroup = value; }}
公共字符串SelectedChoice {get {return“”; }}
private bool mRequired = false; public bool必需{get {return mRequired; } set {mRequired = value; }}
#endregion}
提前致谢。
你有两个选择:ViewState或ControlState。
与ViewState不同的是,可以通过在页面指令中设置EnableViewState="false"
来覆盖ViewState,而ControlState则不能。
基本上你需要在获取/设置下拉列表的值时勾住状态包 。
这里有一个很好的例子,其中一个自定义控件是从Button类派生的,并且在页面请求之间保持状态 - 应该很好地适合您的场景。
希望能让你开始。
链接地址: http://www.djcxy.com/p/56659.html上一篇: How to maintain state in (asp.net) custom server control?