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

StackOverflow https://stackoverflow.com/questions/9341

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

Моя проблема в том, что:

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

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

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

Это было полезно?

Решение

<%@ 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-хакерству.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top