2010-10-31 62 views
0

在Repeater中使用DropDownList调试回发问题时,我发现即使一切看起来像设置正确,DropDownList上用户的选择也不会从视图状态恢复。即使VS 2008暗示True,缺少DropDownList中的EnableViewState也会缺省为False?

我的DropDownList被定义为

<asp:DropDownList ID="EmployeeColumnDropDownList" runat="server" Visible="True" /> 

VS2008属性面板指示的EnableViewState为True 可见是真正的可以看出所以它应该被启用。然而,通过调试器并追踪Page_load,OnItemDataBound和我感兴趣的实际click_event,显示数据没有从视图状态填充。

我遇到的问题是,用户所做的选择没有被我的事件处理代码拾取,它似乎恢复到在初始页面开始时设置的内容的Page_Load(它具有强制性

if (!this.IsPostBack) 

包装用于填充中继器和下拉列表。

插入特定的EnableViewState =“真”到我的定义如下解决了这个问题。

<asp:DropDownList ID="EmployeeColumnDropDownList" runat="server" Visible="True" EnableViewState="True" /> 

请记住,无论如何,VS2008在属性检查器中显示为True。

这是预期的行为?还是我通过强制条件通过解决方案?

我在问这个问题,因为这看起来有点奇怪,我不希望这段代码突然停止工作以后再咬我。

编辑澄清我是如何处理的代码

我正在使用一个中继器产生,都是从上通过中继器的每个循环中OnItemDataBound回调中填充一些下拉列表。

我有一个按钮以外的按钮,连接到一个onclick事件处理程序。这是这个处理程序不读取正确的用户选择。

编辑 - 视图状态似乎是一个红色的鲱鱼

经过研究和调试时间,我认为视图状态是一个红色的鲱鱼。

我在这里有一个错误,导致我的下拉列表不会在第一次回发时保留它们的选定状态(由按钮单击引起),当表单返回时,它们已经失去了它们的选择状态仍然有正确的内容)。

所有后续回发,使用相同的按钮保留正确的选择。所有代码都是相同的,就我所见所有回发。

就好像它没有正确地将请求参数合并到第一次回发中的视图状态。

我想设置一个非常简单的例子来深入研究,但它已经让我失去了将近一天的工作。我一直在考虑自己合并数据,但在我的情况下,中继器的存在并没有让事情变得简单。如果所有满足以下条件

回答

0

OK解开了谜团。

我在这里发布这个以防万一它在未来帮助别人。

我有一小段旧代码,我设置了我的下拉列表,集中完成,因此我可以将它应用于同一页上的三种类型的下拉列表。此代码仅在初始Page_Load事件中调用,但它在下拉列表控件上设置了新的ID,因此会损害由Repeater创建的唯一ID。

在第一次回发时,视图状态中的条目与请求数据不匹配,这使运行时混淆了。在随后的回传中,它似乎与自己同步。

所以我的建议是,如果您要创建Dropdownlists,或者我想象其他控件,请在Repeater或类似的迭代器中,然后不要混淆ID字段,如果您希望内置功能按预期工作。

(做任何这里的有经验的人都认为我应该这个问题,重命名为类似“如果在一个中继器创建不要忽略一个下拉列表的ID”)

0

视图状态的控制有效:

  1. 这个页面的EnableViewState属性设置为true。

  2. 该控件的EnableViewState属性设置为true。

  3. 该控件的ViewStateMode属性设置为Enabled或继承Enabled设置。

如果需要,你可以设置的AutoPostBack =真,检查是否正在使用的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(); 
    } 
} 

上的.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> 
+0

欢呼声,但没有喜悦。 – 2010-10-31 11:05:46

+0

已经特别检查了2)和3)另外我没有使用UpdatePanel。我不希望AutoPostBack作为下拉列表。我没有为页面值指定任何内容。我只是在页面级声明中添加的,它又被破坏了。不幸的是,我之前所做的还是再次破裂,所以我很担心,我需要深入研究DropDownLists的工作方式,因为这显然不是我以为他们做的。 – 2010-10-31 11:07:20

+0

感谢您的编辑。这实际上就是我所拥有的(我在rpeater中生成了我的下拉列表,因为我有几个)。我的事件是按钮单击事件,然后读取下拉列表以获取用户输入,并且它们不反映选择。有趣的是,如果我允许在mu按钮点击处理程序后将页面返回给用户,则选择都是正确的。所以我现在要去狩猎如何阅读中继器中的下拉列表。 – 2010-10-31 11:31:59

相关问题