Запуск Javascript после установки выбранного значения элемента управления - PullRequest
8 голосов
/ 13 августа 2008

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 13 августа 2008

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

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

2 голосов
/ 13 августа 2008
<%@ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...