Простое приложение ASP.NET.
У меня есть два раскрывающихся списка. В первом раскрывающемся списке у меня есть событие JavaScript onChange. JavaScript включает второй раскрывающийся список и удаляет из него значение (значение, выбранное в первом раскрывающемся списке). Если они щелкнут пустое первое значение раскрывающегося списка, то второе раскрывающееся меню будет отключено (и параметры будут сброшены).
У меня также есть код в методе OnPreRender, который будет включать или отключать второй раскрывающийся список в зависимости от значения первого раскрывающегося списка. Это сделано для того, чтобы значение первого раскрывающегося списка можно было выбрать в коде (загрузка пользовательских настроек).
Моя проблема:
Я попытался добавить сценарий запуска (который установит правильное состояние второго раскрывающегося списка) через ClientScript.RegisterStartupScript, однако, когда он вызывается, в первом раскрывающемся списке есть selectedIndex из 0, а не то, что есть на самом деле. Я предполагаю, что значение выбора устанавливается после моего стартового скрипта (но все еще не вызывает скрипт onChange).
Есть идеи, что попробовать?





Если второй раскрывающийся список изначально включен через 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.