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

How to maintain state in (asp.net) custom server control?

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

1
2
3
4
5
6
7
8
9
10
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);
}

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

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

以下是完整的资料来源:

1
public class MultipleChoiceQuestionView2 : DropDownList

{公共多回音问题视图2()基础(){}

受保护的重写void render(htmltextwriter writer){writer.renderbegintag(htmltextwritertag.table);writer.renderbegintag(htmltextwritertag.tr);

writer.renderbegintag(htmltextwritertag.td);#区域分析内容如果(!)string.isNullOrEmpty(this.contents){xelement root=xelement.parse(this.contents);

if(根.hasattributes){this.noofchoices=int32.parse(root.attribute("itemcount").value);}

this.items.clear();this.style.add("宽度","100px");this.style.add("字体系列","Tahoma");this.items.clear();listem item=new listem();项目。item.value="0";添加(项);

foreach(root.elements中的xelement子级("choice")){字符串标题=child.element("title").value;字符串score=child.element("score").value;item=new listem();item.text=标题;item.value=得分;

1
this.Items.Add(item);

}}γ端区base.render(作者);writer.renderdtag();

如果(这是必需的){RequiredFieldvalidator rfv=新的RequiredFieldvalidator();rfv.controlToValidate=this.id;rfv.initialValue="0";文本="*";如果(!)string.isNullOrEmpty(this.validationGroup)){rfv.validationgroup=this.validationgroup;}writer.renderbegintag(htmltextwritertag.td);rendercontrol(作者);writer.renderdtag();}

writer.renderdtag();writer.renderdtag();}#区域属性公共字符串内容{得到{返回viewstate["contents"]==空?:viewstate["contents"].toString();}设置{viewstate["contents"]=值;}}

私人内部选举;公共建筑{获取返回mnoofchoices;设置mnoofchoices=value;}

私有字符串mvalidationgroup;公共字符串验证组{get返回mvalidationgroup;设置mvalidationgroup=value;}

公共字符串selectedchoice{得到{返回;}}

private bool mrequired=false;需要公共bool{GeT退货需求;设置mrequired=value;}

γ端区}

事先谢谢。


您有两个选项:viewstate或controlstate。

通过在page指令中设置EnableViewState="false"可以覆盖viewstate的差异,而controlState不能。

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

这里有一个很好的例子,其中一个自定义控件是从button类派生的,并且在页面请求之间保持状态——应该很适合您的场景。

希望这能让你开始。