12

简单的 ASP.NET 应用程序。

我有两个下拉控件。在第一个下拉菜单中,我有一个 JavaScriptonChange事件。JavaScript 启用第二个下拉菜单并从中删除一个值(在第一个下拉菜单中选择的值)。如果他们单击下拉列表的第一个空白值,则第二个下拉列表将被禁用(并且选项重置)。

我在方法中也有代码,OnPreRender可以根据第一个下拉列表的值启用或禁用第二个下拉列表。这样可以在代码中选择第一个下拉列表的值(加载用户设置)。

我的问题是:

  1. 用户在第一个下拉列表中选择了一些东西。第二个下拉菜单将通过 JavaScript 启用。
  2. 然后,他们更改了启动回发的第三个下拉菜单。回发后,下拉菜单处于正确状态(选择第一个值,启用第二个下拉菜单)。
  3. 如果他们然后单击后退按钮,则将不再启用第二个下拉菜单,尽管它应该启用,因为在第一个下拉菜单中选择了某些内容。

我已经尝试通过添加一个启动脚本(它将设置第二个下拉菜单的正确状态)ClientScript.RegisterStartupScript,但是当它被调用时,第一个下拉菜单有一个selectedIndexof 0,而不是它实际上是什么。我的猜测是在我的启动脚本之后设置了选择的值(但仍然不调用onChange脚本)。

关于尝试什么的任何想法?

4

2 回答 2

4

如果第二个下拉菜单最初是通过 javascript 启用的(我假设这是在 javascript onchange 期间,因为您没有指定),那么单击后退按钮重新加载上一个回发将永远不会启用它。

将 ASP.NET 与经典 javascript 混合起来可能很麻烦。您可能想看看 ASP.NET 的 Ajax 实现(或者如果您被迫使用较旧的 ASP.NET 版本,则可以查看第三方 AjaxPanel 控件)。这些将通过纯 C# 为您提供您想要的行为,而不会强迫您诉诸 javascripthackery-pokery。

于 2008-08-13T00:16:51.233 回答
2
<%@ 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>

编辑:替换了整个代码。即使在您的用户控件中,这也应该有效。我相信 Register.ClientScriptBlock 不起作用,因为您在该块中编写的代码是在调用 window.onload之前执行的。而且,我假设(我不确定这一点)DOM 对象当时没有设置它们的值。而且,这就是为什么您总是得到 selectedIndex 0。

于 2008-08-13T00:53:34.077 回答