C# 即使VS 2008暗示为真,DropDownList中缺少EnableViewState是否默认为假?

C# 即使VS 2008暗示为真,DropDownList中缺少EnableViewState是否默认为假?,c#,asp.net,visual-studio-2008,drop-down-menu,viewstate,C#,Asp.net,Visual Studio 2008,Drop Down Menu,Viewstate,在调试中继器中的DropDownList的回发问题时,我发现即使一切看起来都设置正确,DropDownList上用户的选择也没有从视图状态恢复 我的DropDownList被定义为 <asp:DropDownList ID="EmployeeColumnDropDownList" runat="server" Visible="True" /> 用于填充转发器和下拉列表的包装器 在我的定义中插入一个特定的enableViewState=“True”,如下所示解决了这个问题 <

在调试中继器中的DropDownList的回发问题时,我发现即使一切看起来都设置正确,DropDownList上用户的选择也没有从视图状态恢复

我的DropDownList被定义为

<asp:DropDownList ID="EmployeeColumnDropDownList" runat="server" Visible="True" />
用于填充转发器和下拉列表的包装器

在我的定义中插入一个特定的enableViewState=“True”,如下所示解决了这个问题

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

请记住,VS2008在properties inspector上显示为True

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

我问这个问题,因为这似乎有点奇怪,我不希望这个代码稍后突然停止工作而咬我一口

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

我有几个下拉列表是使用中继器生成的,它们都是通过中继器在每个循环上的OnItemDataBound回调中填充的

我在中继器外面有一个按钮,它连接到onclick事件处理程序。该处理程序没有读取正确的用户选择

编辑-视图状态看起来像是一条红鲱鱼

经过数小时的研究和调试,我认为视图状态是一种误导

我在这里的某个地方有一个bug,它导致我的下拉列表在第一次回发时无法保留其选定状态(由单击按钮引起),当表单返回时,它们已丢失其选定状态(它们仍然具有正确的内容)

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

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


我试图建立一个非常简单的例子来深入研究这个问题,但到目前为止,我已经失去了近一天的工作。我一直在考虑自己合并数据,但在我的情况下,中继器的存在并不能使事情变得简单。

如果满足以下所有条件,则控件的Viewstate将启用:

  • 页面的EnableViewState属性设置为true

  • 控件的EnableViewState属性设置为true

  • 控件的ViewStateMode属性设置为Enabled或继承Enabled设置

  • 如果需要,您可以设置AutoPostBack=True,检查您是否正在使用UpdatePanel,并且VisualStudio2008有一个应该安装的service pack

    编辑:

    下面是一段代码(调试时EnableViewState始终为true)。用户选择的值在http请求中保持不变

    protected void Page_Load(object sender, EventArgs e)
    {
       if (!Page.IsPostBack)
       {
          ddl.DataSource = new List<string> { "1", "2", "3" };
          ddl.DataBind();
       }
    }
    
    受保护的无效页面加载(对象发送方,事件参数e)
    {
    如果(!Page.IsPostBack)
    {
    ddl.DataSource=新列表{“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>
    
    
    
    好的,解开了谜团

    我把这篇文章贴在这里,以防将来对其他人有所帮助

    我有一小段旧代码,在那里我设置了我的下拉列表,集中完成,这样我就可以将它应用于同一页面上的三种类型的下拉列表。此代码仅在初始Page_Load事件期间调用,但是它在dropdownlist控件上设置了一个新ID,因此影响了中继器创建的唯一ID

    在第一次回发时,viewstate中的条目与请求数据不匹配,这使运行时感到困惑。在随后的回帖中,它似乎与自己步调一致

    因此,我的建议是,如果您要在中继器或类似迭代器中创建Dropdownlists,或者我想象其他控件,那么如果您希望内置功能按预期工作,请不要弄乱ID字段


    (这里有没有经验的人认为我应该把这个问题改名为“如果在中继器中创建,不要覆盖dropdownlist的ID”)

    专门检查了第2点)和第3点)此外,我没有使用UpdatePanel。我不想让下拉列表自动回邮。我没有为页面值指定任何内容。我刚刚添加了一个页面级声明,它又被破坏了。不幸的是,回到我以前的状态现在又被破坏了,所以我担心是对的,我需要深入研究DropDownList是如何工作的,因为它显然不是我想象中的那样。谢谢编辑。这实际上就是我所拥有的(我在rpeater中生成我的dropdownlist,因为我有一些)。我的事件是button click事件,然后读取下拉列表以获取用户输入,但它们并不反映选择。有趣的是,如果我允许页面在mu按钮单击处理程序后返回给用户,那么选择都是正确的。所以我现在要去寻找如何在中继器中读取下拉列表。
    <%@ 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>