我正在使用ASP.NET 4.0,我在DropDownList中保存所选值时遇到问题。
我在Web Control的PreRender方法中初始化它如下:
if (!Page.IsPostBack)
LoadCountryList();
LoadCountryList的代码是:
private void LoadCountryList()
{
var vr = new CountryRepository();
var countryList = vr.GetAllForList();
DdlCountry.EnableViewState = true;
DdlCountry.DataValueField = "code";
DdlCountry.DataTextField = "name";
DdlCountry.DataSource = countryList;
DdlCountry.DataBind();
}
在我提交表单后,我注意到DropDownList是空的(它不是在回发之前)。如果你看一下我的代码,我已经为这个控件启用了ViewState,但是我还没有得到任何结果。有人知道发生了什么吗?
修改
以下是aspx文件中控件的简单代码:
<asp:DropDownList Runat="server" ID="DdlCountry">
</asp:DropDownList>
答案 0 :(得分:9)
如果它在prerender中,那么就是在ViewState初始化之前,所以你不是在回发上重新加载数据而你也无法从ViewState获取,因为它没有放在那里。下拉列表中最好的事情就是在回发时加载它们,但是需要一些缓存。这样你的ViewState就不会膨胀,它仍会在回发时处理你的事件,而你也不会捣毁你的数据库。
更新:
校正。 @StriplingWarrior在下面关于PreRender的评论中是正确的(它将在PreRender中加载到ViewState中)。但是,我不知道你怎么能比我的建议更简单。对于下拉列表,请执行以下操作:
但是,你可以通过确保数据被缓存来改善这一点(因为每次运行你的页面/控制init时它都会被点击),但除非是高流量,否则这并不过分关注..或者至少,它需要与所有其他缓存/数据库问题一起进行评估。
这是一个更好的解决方案(除了解决您的问题)之外的最大原因是,您的ViewState不会因为所有项目(Base64编码为启动)而不必要地膨胀,同时仍然能够跟踪下拉列表中的所选项目(关闭ViewState以获取下拉菜单,使您无法跟踪所选项目而无需直接查看表单发布值)。
答案 1 :(得分:7)
如果MasterPage的EnableViewState设置为false,我观察到了这种现象。 (VS2008)
我的解决方案是在GET和POST中填充下拉列表,并从Page_Load中的Form变量中检索SelectedValue:
if (IsPostBack)
{
dropdown.SelectedValue = Request.Form[dropdown.UniqueID];
}
答案 2 :(得分:0)
ViewState和ASP.NET页面生命周期是奇怪的野兽。你有时必须得到正确的“时机”。尝试:
答案 3 :(得分:0)
解决方案:
Set Enable View State=true