2008-08-13 36 views
7

Ứng dụng ASP.NET đơn giản.Chạy Javascript sau khi giá trị đã chọn của kiểm soát đã được đặt

Tôi có hai điều khiển thả xuống. Trên menu thả xuống đầu tiên, tôi có sự kiện JavaScript onChange. JavaScript cho phép trình đơn thả xuống thứ hai và loại bỏ một giá trị từ nó (giá trị được chọn trong menu thả xuống đầu tiên). Nếu họ nhấp vào giá trị đầu tiên trống của trình đơn thả xuống, thì trình đơn thả xuống thứ hai sẽ bị tắt (và các tùy chọn đặt lại).

Tôi cũng có mã trong phương thức OnPreRender sẽ bật hoặc tắt trình đơn thả xuống thứ hai dựa trên giá trị của menu thả xuống đầu tiên. Điều này là để giá trị của menu thả xuống đầu tiên có thể được chọn trong mã (tải cài đặt người dùng).

Vấn đề của tôi là:

  1. Người dùng chọn một cái gì đó trong trình đơn thả xuống đầu tiên. Trình đơn thả xuống thứ hai sẽ được bật thông qua JavaScript.
  2. Sau đó, họ thay đổi menu thả xuống thứ ba để bắt đầu đăng lại. Sau khi đăng lại, các trình đơn thả xuống đang ở trạng thái chính xác (giá trị đầu tiên được chọn, kích hoạt thả xuống thứ hai).
  3. Nếu sau đó họ nhấp vào nút quay lại, menu thả xuống thứ hai sẽ không còn được kích hoạt mặc dù nó phải là vì có một số thứ được chọn trong menu thả xuống đầu tiên.

Tôi đã thử thêm một kịch bản khởi động (mà sẽ thiết lập trạng thái đúng đắn về thứ hai thả xuống) qua ClientScript.RegisterStartupScript, tuy nhiên khi điều này được gọi là trình đơn thả xuống đầu tiên có một selectedIndex của 0, không phải những gì nó Thực sự là. Tôi đoán là giá trị của vùng chọn được đặt sau tập lệnh bắt đầu của tôi (nhưng vẫn không gọi là tập lệnh onChange).

Mọi ý tưởng về những gì cần thử?

Trả lời

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> 

Chỉnh sửa: Đã thay thế toàn bộ mã. Điều này sẽ hoạt động ngay cả trong điều khiển người dùng của bạn. Tôi tin rằng Register.ClientScriptBlock không hoạt động vì mã bạn viết trong khối đó được thực hiện trước khi window.onload được gọi. Và, tôi giả sử (tôi không chắc chắn về điểm này) rằng các đối tượng DOM không có giá trị của chúng được thiết lập tại thời điểm đó. Và, đây là lý do tại sao bạn nhận được selectIndex như thường lệ 0.

3

Nếu trình đơn thả xuống thứ hai ban đầu được bật thông qua javascript (tôi giả định đây là trong javascript onchange, vì bạn không chỉ định), sau đó nhấp vào nút quay lại để tải lại bài đăng trước đó sẽ không bao giờ bật nó.

Trộn ASP.NET với javascript cổ điển có thể là lông. Bạn có thể muốn xem xét triển khai Ajax của ASP.NET (hoặc điều khiển AjaxPanel của bên thứ ba nếu bạn buộc phải sử dụng phiên bản ASP.NET cũ hơn). Những người sẽ cung cấp cho bạn những hành vi mà bạn muốn thông qua tinh khiết C#, mà không buộc bạn phải nghỉ mát để javascript hackery-pokery.

Các vấn đề liên quan