在使用Repeater中的DropDownList调试回发问题时,我发现即使所有内容都设置正确,DropDownList上用户的选择也没有从视图状态恢复。
我的DropDownList被定义为
<asp:DropDownList ID="EmployeeColumnDropDownList" runat="server" Visible="True" />
VS2008属性检查器指示EnableViewState为True 可见,可见是真的,所以应该启用它。然后逐步使用调试器并跟踪Page_load,OnItemDataBound和我感兴趣的实际click_event,表明数据没有从视图状态填充。
我遇到的问题是用户所做的选择没有被我的事件处理代码拾取,而且它似乎又恢复到初始page_load上页面渲染开始时设置的内容(有必要的
if (!this.IsPostBack)
用于填充转发器和下拉列表的包装器。
在我的定义中插入一个特定的enableViewState =“True”解决了这个问题。
<asp:DropDownList ID="EmployeeColumnDropDownList" runat="server" Visible="True" EnableViewState="True" />
请记住,VS2008无论如何都会在属性检查器上显示为True。
这是预期的行为吗?或者我通过迫使条件通过了解决方案?
我问这个问题,因为这看起来有点奇怪,我不希望这段代码后来因为突然停止工作而咬我。
编辑以澄清我如何处理代码
我有一些使用转发器生成的下拉列表,并且都是通过转发器在每个循环的OnItemDataBound回调中填充的。
我在转发器外面有一个按钮,它连接到onclick事件处理程序。正是这个处理程序没有读取正确的用户选择。
编辑 - 视图状态似乎是红色鲱鱼
经过数小时的研究和调试后,我认为视图状态是一个红色的鲱鱼。
我在这里有一个错误导致我的下拉列表不能在第一个回发时保留他们选择的状态(由按钮点击引起),当表单返回时他们已经失去了他们的选择状态(他们仍然有正确的内容。)
所有后续回发,使用相同的按钮保留正确的选择。对于所有回发,所有代码都是相同的。
就好像它没有正确地将请求参数合并到视图状态中进行第一次回发。
我正在尝试建立一个非常简单的例子来深入研究这个问题,但到目前为止,我已经失去了近一天的工作。我一直在考虑自己合并数据,但在我的情况下,转发器的存在并不容易。
答案 0 :(得分:0)
如果满足以下所有条件,则启用控件的Viewstate:
页面的EnableViewState属性设置为true。
控件的EnableViewState属性设置为true。
控件的ViewStateMode属性设置为Enabled或继承Enabled设置。
如果需要,你可以设置AutoPostBack = True,检查你是否使用UpdatePanel,Visual Studio 2008也有一个应该安装的服务包
修改强>
这是一个有效的代码(调试时EnableViewState始终为true)。用户选择的值在http请求中保持不变。
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ddl.DataSource = new List<string> { "1", "2", "3" };
ddl.DataBind();
}
}
on .aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<form id="form1" runat="server">
<asp:DropDownList ID="ddl" runat="server" EnableViewState="true"/>
</form>
</body>
</html>
答案 1 :(得分:0)
确定解开了这个谜。
我在这里张贴这个,以防将来帮助其他人。
我有一小段旧代码,我设置了下拉列表,集中完成,因此我可以将它应用于同一页面上的三种类型的下拉列表。此代码仅在初始Page_Load事件期间调用,但它在下拉列表控件上设置了一个新ID,因此会影响Repeater创建的唯一ID。
在第一个回发中,视图状态中的条目与请求数据不匹配,这使运行时混乱。在随后的回发中,它似乎与自己保持同步。
所以我的建议是,如果您要创建Dropdownlists,或者我想象其他控件,在Repeater或类似的迭代器中,如果您希望内置功能按预期工作,请不要弄乱ID字段。
(这里有经验的人认为我应该将此问题重命名为“如果在转发器中创建,请不要覆盖下拉列表的ID”)