这是问题..
我的小页面有标签,下拉列表和提交按钮。
<div>
<asp:label id="Message" runat="server"/>
<br />
Which city do you wish to look at on hotels for?<br /><br />
<asp:dropdownlist id="Dropdownlist1" runat="server" EnableViewState="true">
</asp:dropdownlist>
<br /><br /><br /><br />
<input type="Submit" />
</div>
在表单加载时,我将项目插入下拉列表,然后在按钮上单击我显示下拉列表中项目的计数。这是代码。
if (Page.IsPostBack)
{
Message.Text = "You have selected " + Dropdownlist1.Items.Count.ToString();
}
else
{
Message.Text = "You have selected " + Dropdownlist1.Items.Count.ToString();
Dropdownlist1.Items.Add("Madrid");
Dropdownlist1.Items.Add("Chennai");
Dropdownlist1.Items.Add("New York");
}
这是有趣的部分。如果我直接从IDE运行它,它的工作完全正常。我第一次将计数设为0,按提交按钮时计数为3。我需要在现有的虚拟目录上运行这个小代码。如果我在该虚拟目录中运行相同的aspx页面,那么第一次加载时我会得到0。当我点击提交时,我得到0计数,我没有在下拉列表中看到任何项目,它被清除。我已将viewstate设置为true,以便记住插入的内容。
当我从IDE运行它并从另一个虚拟目录运行它时,我不确定有什么区别。我是Asp.Net的新手,所以我在这里挖出了所有选项,以便了解下拉列表的工作原理。我在这里找不到配置吗?
顺便说一下,当我把DropDownList放在向导控件中时,我遇到了同样的问题。当从IDE运行时,它工作正常,但是当我从虚拟目录运行时,它没有获得所选值,也不记得下拉列表中的项目。
对此有任何帮助将不胜感激。
根据您的代码,列表仅在不是PostBack时才会填充。因此,当您单击该按钮时,列表将为空。如果您动态填充列表,则不会记住这些项目。您必须在每个Page_load中添加。视图状态只会记住选择了哪个项目。
如何记住直接从IDE执行页面时的项目,而不记得我从虚拟目录运行的时间。是否存在我可能需要设置以使其工作的视图状态。缓存设置也没有太大的运气。我启用了跟踪信息,有趣的事情:|,直接从IDE而不是从虚拟目录执行跟踪。再次提问,子目录的web.config应该覆盖父web.config吗?
感谢您的回复。
答案 0 :(得分:4)
听起来您可能在页面级别禁用了EnableViewState。与其他响应相反,如果启用了ViewState,则无需在PostBack上重新填充列表。
尝试在页眉中添加EnableViewState =“true”属性。
我认为这是一个错误。如果在页面级别启用EnableViewState =“false”,并且在控件级别启用EnableViewState =“true”,则控件不会保留ViewState状态。
如果您只想为某些控件启用ViewState,请在页面级别设置EnableViewState =“true”,然后为您不想保留ViewState的控件设置EnableViewState =“false”。向后,我知道,但这是唯一的解决方法。
答案 1 :(得分:2)
这对我有用
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
FillApplicationDropDown();
}
答案 2 :(得分:0)
在虚拟目录中可能正在缓存页面。
尝试将此添加到Page_Load
Response.Cache.SetCacheability(HttpCacheability.NoCache)
我认为可以使用配置文件将缓存应用于目录。所以可能是差异。