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指令中设置
本质上,当您获取/设置下拉列表的值时,需要钩住状态包。
这里有一个很好的例子,其中一个自定义控件是从button类派生的,并且在页面请求之间保持状态——应该很适合您的场景。
希望这能让你开始。