2013-01-08 50 views
0

我是ASP.NET的初学者,但我试图修复其他人编写的应用程序中的错误:下拉列表的选择不会保留在回发中。如何在回发中保留DataList中DropDownList的选择?

这里是什么,我相信是代码的相关部分:

<asp:DataList ... OnItemDataBound="PopulateDropDownList"> 
    ... 
    <FooterTemplate> 
     <asp:DropDownList ... AutoPostBack="true" OnSelectedIndexChanged="DoSomething"/> 
    </FooterTemplate>        
</asp:DataList> 

我相信我可以存储在会话中的当前选择,静态变量或其他地方,但是这似乎更像是一个工作 - 那么一个解决方案。

回答

0

一位同事指出,Page_Load方法重新绑定了DataList,即使当前请求是回发。如果请求不是回显,则通过将此更改为仅将数据绑定到DataList解决了问题。

这似乎是问题的根源,所以我认为这是最好的解决方案。

1

通常你可以设置的EnableViewState为“真” - 如下:

<asp:DropDownList ... EnableViewState="true" ...> 
</asp:DropDownList>` 

但我不是100%肯定,如果它的工作原理DataList控件内以同样的方式,但我猜测它应该。

您可以从Understanding ASP.NET View State了解关于视图状态的更多信息。

请确保您只为您绝对需要的控件启用ViewState,否则会遇到内存问题。从上面的源代码(我的重点):

EnableViewState属性是在System.Web.UI.Control类中定义的,所以所有的服务器控件都有这个属性,包括Page类。 因此,您可以通过将Page类的EnableViewState设置为False来指示整个页面的视图状态不需要保存。(这可以通过或者在代码隐藏与Page.EnableViewState =假类;或作为@网页级指令 - <%@页的EnableViewState =“假”%>

+0

设计者表示默认情况下这是'true'。我没有把它设置为“假”。 – Sam

+0

@Sam:对于页面级别,是的,“EnableViewState”默认为true,但对于单个控件,您必须明确设置它。请参阅我的编辑。让我知道你是否仍然有麻烦。 – Chaithanya

+0

@Sam:你也可以尝试将EnableViewState设置为 Chaithanya

0

首先检查页面。视图状态设置为True False。包括EnableViewState =“true”在这里肯定会用到你的目的,你不需要在会话中保存选择等。

+0

这工作在我设置的一个非常简单的测试页面,但在实际的页面中,这是非常大的,这不起作用。 – Sam

+0

你能分享整个aspx代码吗? – Umesh

+0

Nah;它差不多有1000行,而且来自一个商业项目。 – Sam

0

在代码隐藏中,在数据绑定页面的Init事件而不是Load事件可以解决这个问题。但是,这样做的一个缺点是在Init期间一些控制值不会被填充。

相关问题