【发布时间】:2010-06-21 20:39:40
【问题描述】:
设置
使用:Visual Web Developer 2010 Express。
语言:C#。
目标框架:.NET Framework 4。
ViewState:我在 Web.Config 中禁用了 ViewState - 即<configuration><system.web><pages enableViewState="false" />。
问题
我有一个带有标准 DropDownList 控件的 ASP.NET 页面。
我在 DropDownList 上设置了 EnableViewState="true" 和 ViewStateMode="Enabled"。
我在代码隐藏中使用数据绑定来填充控件(这很好用)。
数据绑定发生在来自 Page_PreRender 的调用中,包括初始加载和回发。
在来自 Button Click 事件处理程序(即在 Page_PreRender 之前)的调用中,我试图从 DropDownList 的 SelectedValue 属性中读取数据。
问题是:我收到的只是一个零长度字符串(“”)值,并且对对象的检查表明控件包含值。
解决方案
确保在包含 DropDownList 的页面上的 指令中设置了 EnableViewState="true"。
或者,您可以为 DropDownList 创建一个扩展方法,该方法从 HttpRequest 集合中读取值。
例如
public static string GetSelectedValue(this System.Web.UI.WebControls.DropDownList listBox)
{
return HttpContext.Current.Request[listBox.ClientID];
}
【问题讨论】:
-
关于扩展方法解决方案:当DropDownList在自定义UserControl中时,这将失败(.ClientID值错误),无论
web.config 中的设置与否。原因:clientIDMode 是一个原因(它将值更改为不包含 UserControl ID)。但是,当 clientIDMode 不是“Static”时,Request 集合中 DropDownList 的控件名称/键使用“$”分隔符,而控件的 .ClientID 则返回“_”。解决方案是使用 DropDownList 的 .UniqueID 属性。 -
我还在 Visual Studio 2008 和 .NET 3.5 下对此进行了测试。在 @Page 指令中不包含 EnableViewState 时也会出现同样的问题。