2008-08-13 3 views
7

Простой ASP.NET-приложение.Запуск Javascript после выбранного значения элемента управления

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

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

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

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

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

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

ответ

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.

3

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

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

Смежные вопросы