Asp.net 在控件'之后运行Javascript;s的选定值已设置

Asp.net 在控件'之后运行Javascript;s的选定值已设置,asp.net,javascript,Asp.net,Javascript,简单的ASP.NET应用程序 我有两个下拉控件。在第一个下拉列表中,我有一个JavaScriptonChange事件。JavaScript启用第二个下拉列表并从中删除一个值(第一个下拉列表中选择的值)。如果他们单击下拉的空白第一个值,那么第二个下拉将被禁用(并且选项重置)。 我还有OnPreRender方法中的代码,它将根据第一个下拉列表的值启用或禁用第二个下拉列表。这样可以在代码(加载用户设置)中选择第一个下拉列表的值 我的问题是: 用户在第一个下拉列表中选择一些内容。第二个下拉列表将通过Ja

简单的ASP.NET应用程序

我有两个下拉控件。在第一个下拉列表中,我有一个JavaScript
onChange
事件。JavaScript启用第二个下拉列表并从中删除一个值(第一个下拉列表中选择的值)。如果他们单击下拉的空白第一个值,那么第二个下拉将被禁用(并且选项重置)。 我还有
OnPreRender
方法中的代码,它将根据第一个下拉列表的值启用或禁用第二个下拉列表。这样可以在代码(加载用户设置)中选择第一个下拉列表的值

我的问题是:

  • 用户在第一个下拉列表中选择一些内容。第二个下拉列表将通过JavaScript启用
  • 然后,它们更改第三个下拉列表,该下拉列表启动回发。回发后,下拉列表处于正确状态(选择第一个值,启用第二个下拉列表)
  • 如果他们单击“上一步”按钮,则第二个下拉列表将不再启用,尽管应该启用,因为在第一个下拉列表中选择了某些内容
  • 我曾尝试通过
    ClientScript.RegisterStartupScript
    添加启动脚本(将设置第二个下拉列表的正确状态),但是当调用该脚本时,第一个下拉列表的
    selectedIndex
    值为
    0
    ,而不是实际值。我猜选择的值是在我的开始脚本之后设置的(但仍然不调用
    onChange
    脚本)


    有什么想法吗?

    如果第二个下拉列表最初是通过javascript启用的(我假设这是在javascript更改期间,因为您没有指定),那么单击“上一步”按钮重新加载上一次回发将永远无法启用它

    将ASP.NET与经典javascript混合使用可能会令人毛骨悚然。您可能想看看ASP.NET的Ajax实现(如果您被迫使用较旧的ASP.NET版本,还可以查看第三方AjaxPanel控件)。这些将通过纯C#为您提供所需的行为,而不会迫使您求助于javascript黑客扑克。

    
    
    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
        protected void indexChanged(object sender, EventArgs e)
        {
            Label1.Text = " I did something! ";
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Test Page</title>
    </head>
    <body>
        <script type="text/javascript">
            function firstChanged() {
                if(document.getElementById("firstSelect").selectedIndex != 0)
                    document.getElementById("secondSelect").disabled = false;
                else
                    document.getElementById("secondSelect").disabled = true;
            }
        </script>
        <form id="form1" runat="server">
        <div>
            <select id="firstSelect" onchange="firstChanged()">
                <option value="0"></option>
                <option value="1">One</option>
                <option value="2">Two</option>
                <option value="3">Three</option>
            </select>
            <select id="secondSelect" disabled="disabled">
                <option value="1">One</option>
                <option value="2">Two</option>
                <option value="3">Three</option>
            </select>
            <asp:DropDownList ID="DropDownList1" AutoPostBack="true" OnSelectedIndexChanged="indexChanged" runat="server">
                <asp:ListItem Text="One" Value="1"></asp:ListItem>
                <asp:ListItem Text="Two" Value="2"></asp:ListItem>    
            </asp:DropDownList>
            <asp:Label ID="Label1" runat="server"></asp:Label>
        </div>
        </form>
        <script type="text/javascript">
            window.onload = function() {firstChanged();}
        </script>
    </body>
    </html>
    
    受保护的void indexChanged(对象发送方,事件参数e) { Label1.Text=“我做了些什么!”; } 测试页 函数firstChanged(){ if(document.getElementById(“firstSelect”).selectedIndex!=0) document.getElementById(“secondSelect”).disabled=false; 其他的 document.getElementById(“secondSelect”).disabled=true; } 一个 两个 三 一个 两个 三 window.onload=函数(){firstChanged();}
    编辑:替换了整个代码。即使在您的用户控件中,这也应该起作用。 我认为Register.ClientScriptBlock不起作用,因为在该块中编写的代码是在调用window.onload之前执行的。并且,我假设(我不确定这一点)DOM对象当时没有设置它们的值。这就是为什么您总是得到selectedIndex 0