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

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

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
3 932
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Ответ принят как подходящий

<%@ 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.

Другие вопросы по теме