Запуск Javascript после установки выбранного значения элемента управления

Простое приложение ASP.NET.

У меня есть два раскрывающихся списка. В первом раскрывающемся списке у меня есть onChange событие JavaScript . JavaScript включает второй раскрывающийся список и удаляет из него значение (значение, выбранное в первом раскрывающемся списке). Если они щелкнут пустое первое значение раскрывающегося списка, то второе раскрывающееся меню будет отключено (и параметры будут сброшены).

У меня также есть код в OnPreRender методе, который будет включать или отключать второй раскрывающийся список в зависимости от значения первого раскрывающегося списка. Это сделано для того, чтобы значение первого раскрывающегося списка можно было выбрать в коде (загрузка пользовательских настроек).

Моя проблема:

  1. Пользователь что-то выбирает в первом раскрывающемся списке. Второй раскрывающийся список станет доступен через JavaScript.
  2. Затем они изменяют третий раскрывающийся список, который запускает ответную публикацию. После обратной публикации раскрывающиеся списки находятся в правильном состоянии (выбрано первое значение, включено второе раскрывающееся меню).
  3. Если затем они нажмут кнопку «Назад», второе раскрывающееся меню больше не будет включено, хотя должно быть, поскольку в первом раскрывающемся списке что-то выбрано.

Я пытался добавить сценарий запуска (который будет установить правильное состояние второго выпадающий) через ClientScript.RegisterStartupScript, однако , когда это вызывается первым выпадающий имеет selectedIndex из 0, а не то , что он на самом деле. Я предполагаю, что значение выбора устанавливается после моего стартового скрипта (но по-прежнему не вызывает onChange скрипт).

Есть идеи, что попробовать?

Ответов (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.

Если второй раскрывающийся список изначально включен через javascript (я предполагаю, что это происходит во время изменения javascript, поскольку вы не указали), то нажатие кнопки «Назад» для перезагрузки предыдущей обратной передачи никогда не активирует его.

Смешивание ASP.NET с классическим JavaScript может быть непростым делом. Возможно, вы захотите взглянуть на реализацию Ajax в ASP.NET (или на сторонний элемент управления AjaxPanel, если вы вынуждены использовать старую версию ASP.NET). Это даст вам поведение, которое вы хотите через чистый C#, не заставляя вас прибегать к хакерской атаке javascript.