12

シンプルな ASP.NET アプリケーション。

2 つのドロップダウン コントロールがあります。最初のドロップダウンには、JavaScriptonChangeイベントがあります。JavaScript は 2 番目のドロップダウンを有効にし、そこから値 (最初のドロップダウンで選択された値) を削除します。ドロップダウンの空白の最初の値をクリックすると、2 番目のドロップダウンが無効になります (オプションがリセットされます)。

OnPreRenderメソッドには、最初のドロップダウンの値に基づいて 2 番目のドロップダウンを有効または無効にするコードもあります。これは、最初のドロップダウンの値をコードで選択できるようにするためです (ユーザー設定の読み込み)。

私の問題は次のとおりです。

  1. ユーザーは最初のドロップダウンで何かを選択します。2 番目のドロップダウンは、JavaScript によって有効になります。
  2. 次に、ポスト バックを開始する 3 番目のドロップダウンを変更します。ポストバック後、ドロップダウンは正しい状態になります (最初の値が選択され、2 番目のドロップダウンが有効になります)。
  3. その後、[戻る] ボタンをクリックすると、最初のドロップダウンで何かが選択されているため、2 番目のドロップダウンが有効になるはずですが、無効になります。

を介してスタートアップ スクリプト (2 番目のドロップダウンの正しい状態を設定する) を追加しようとしましたがClientScript.RegisterStartupScript、これが呼び出されると、最初のドロップダウンには実際の状態ではなく、 selectedIndexofがあります。0私の推測では、開始スクリプトの後に選択の値が設定されます (ただし、まだスクリプトは呼び出されませんonChange)。

何を試すかについてのアイデアはありますか?

4

2 に答える 2

4

2 番目のドロップダウンが最初に javascript で有効になっている場合 (指定しなかったため、これは javascript の onchange 中だと思います)、[戻る] ボタンをクリックして前のポストバックをリロードしても、有効にはなりません。

ASP.NET と従来の JavaScript を混在させるのは難しい場合があります。ASP.NET の Ajax 実装 (または、古い ASP.NET バージョンを使用せざるを得ない場合は、サードパーティの AjaxPanel コントロール) を確認することをお勧めします。これらは、純粋な C# を使用して必要な動作を提供し、javascript ハッカリー ポケリーに頼ることを強制する必要はありません。

于 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>

編集:コード全体を置き換えました。これは、ユーザー コントロールでも機能するはずです。window.onload が呼び出される前に、そのブロックに記述したコードが実行されるため、 Register.ClientScriptBlock が機能していないと思います。そして、DOM オブジェクトにはその時点で値が設定されていないと思います (この点についてはよくわかりません)。そして、これが常に 0 として selectedIndex を取得している理由です。

于 2008-08-13T00:53:34.077 に答える