【问题标题】:ASP.NET DropDownList.SelectedValue has not value on PostBack with dynamic data-bindingASP.NET DropDownList.SelectedValue 在具有动态数据绑定的 PostBack 上没有价值
【发布时间】: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 时也会出现同样的问题。

标签: asp.net viewstate


【解决方案1】:

你是对的(除了 Jason 指出的 UniqueID)

但是为什么要全局禁用视图状态?它是 asp.net 的一大优势,也是页面中许多功能所必需的。对于大多数控件来说,这并没有那么糟糕,所以没有理由害怕它。

您希望密切关注生成大量标记(例如网格)的控件,并且一定要在这些控件上禁用它。

只需在 Page 指令中打开 Trace,您就会看到控件树上的每个节点正在使用多少视图状态。

【讨论】:

  • RE 禁用 ViewState - 这是多种因素的组合,但主要是个人喜好。自从 ViewState 出现之前我就一直在开发,并且仍然更喜欢在金属附近工作并且没有“魔法”。我也更喜欢“加法”的开发方法(根据需要添加)而不是减少(根据需要删除)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2022-06-28
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多