我是一个ASP初学者。. NET,但我正试图修复别人编写的应用程序中的一个错误:下拉列表的选择在回发中不保留。
以下是我认为相关的代码部分:
<asp:DataList ... OnItemDataBound="PopulateDropDownList">
...
<FooterTemplate>
<asp:DropDownList ... AutoPostBack="true" OnSelectedIndexChanged="DoSomething"/>
</FooterTemplate>
</asp:DataList>
我相信我可以将当前选择存储在会话中,静态变量或其他地方,但这似乎更像是一个工作,而不是一个解决方案。
通常您可以将EnableViewState设置为"true" -如下所示:
<asp:DropDownList ... EnableViewState="true" ...>
</asp:DropDownList>`
但是我不能100%确定它是否以同样的方式在数据列表中工作,但我猜它应该。
您可以从理解ASP中了解更多关于视图状态的信息。. NET View State.
确保只对你绝对需要的控件启用ViewState,否则你会遇到内存问题。从上面的来源(强调我的):
EnableViewState属性是在System.Web.UI.Control类中定义的,所以所有服务器控件都有这个属性,包括Page类。因此,您可以通过将page类的EnableViewState设置为False来指示不需要保存整个页面的视图状态。(这可以在Page的代码隐藏类中完成。EnableViewState = false;或者作为@Page级指令- <%@Page EnableViewState="False" %>。
第一个检查Page view state设置为True或False。包括EnableViewState="true"在这里肯定会达到你的目的,你不需要在会话中保存选择等
在代码隐藏中,在页面的Init
事件而不是Load
事件中执行数据绑定可以解决问题。然而,这样做的一个缺点是在Init
期间没有填充一些控制值。
一位同事指出,即使当前请求是回发,Page_Load
方法也会重新绑定DataList
。这个问题已经解决了,修改为只有当请求不是回发时才将数据绑定到DataList
。
这似乎是问题的根本原因,所以我认为这是最好的解决方案。