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

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

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

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

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

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

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

Любые идеи о том, что попробовать?


person Ray    schedule 13.08.2008    source источник


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

person Adhip Gupta    schedule 13.08.2008

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

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

person TheSmurf    schedule 13.08.2008