2009-10-06 8 views
20

Chúng tôi có một hộp kiểm mà ban đầu bị vô hiệu hóa và kiểm tra. Sau đó nó được kích hoạt ở phía máy khách thông qua javascript. Nếu người dùng sau đó bỏ chọn hộp và nhấn nút để gọi một postback, trạng thái của hộp kiểm vẫn như kiểm tra ở phía máy chủ. Đây rõ ràng là hành vi không mong muốn. Đây là một ví dụ.Giá trị hộp kiểm ASP.Net lúc đăng lại là sai?

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testcb.aspx.cs" Inherits="ESC.testcb" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 

    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <script type="text/javascript"> 
     function buttonClick() { 
      var cb = document.getElementById('<%= CheckBox1.ClientID %>'); 
      cb.disabled = false; 
      cb.parentNode.disabled = false; 
     } 


    </script> 

    <div> 
     <asp:CheckBox ID="CheckBox1" runat="server" Checked="true" Enabled="false" /> 
     <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="buttonClick(); return false;" /> 
     <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="button2Click" /> 
    </div> 
    </form> 
</body> 
</html> 

Và mã server-side:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace ESC 
{ 
    public partial class testcb : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
     } 

     protected void button2Click(object sender, EventArgs e) 
     { 
      string h = ""; 
     } 
    } 
} 

Vì vậy, chúng ta phá vỡ tại "chuỗi h" dòng và kiểm tra giá trị của CheckBox1.Checked. Đó là sự thật, ngay cả khi nó được bỏ chọn trên biểu mẫu.

+0

Điều này là do view state of the page của bạn không nhận được cập nhật khi bạn thiết lập thuộc tính kiểm soát của bạn từ mã phía sau. –

+0

Thay vì điều khiển máy chủ sử dụng điều khiển HTML và tôi tin rằng sự cố của bạn đã được giải quyết. –

+1

@Kamran, Viewstate không phải là vấn đề. –

Trả lời

32

Đây là vấn đề đã biết với ASP.NET - vì một số lý do ASP.NET sẽ không cập nhật hộp kiểm trên postback nếu nó bị vô hiệu hóa trong khi tải trang và không được kiểm tra để postback. Tôi không biết chính xác lý do tại sao đó là mặc dù - nếu bạn làm cho hộp kiểm bỏ chọn theo mặc định và chọn nó, giá trị được thay đổi trên máy chủ một cách chính xác.

Giải pháp thay thế là thêm trường bị ẩn vào trang thể hiện trạng thái của hộp kiểm, sau đó cập nhật giá trị của trường thành "BẬT" hoặc "TẮT" chẳng hạn, bất cứ khi nào hộp kiểm được nhấp.

Sau đó trên máy chủ, bạn kiểm tra giá trị của trường bị ẩn, không phải hộp kiểm, vì trường ẩn luôn được đăng.

+0

Tính năng này hoạt động. Cảm ơn. – Anthony

+2

Hi Sam, bạn có thể vui lòng cung cấp thêm thông tin về "vấn đề konown" không? KB hoặc liên kết? Tôi có một hộp kiểm bị thiếu "bỏ chọn"; enabled == True, checked = false khi thoát OnInit; enabled == True, checked = true khi nhập Page_load; Nhưng nó không được kiểm soát từ trình duyệt và nó hoạt động như mong đợi nếu có một asyncpostback không ổn định khác xảy ra trước đó. –

1

Vì bạn đã sử dụng Javascript để điều khiển trạng thái điều khiển trong trình duyệt, tôi khuyên bạn chỉ cần tắt hộp kiểm trên sự kiện tải trang. Sau đó đăng lại của bạn sẽ chỉ làm việc tốt ...

<head> 

    <script type="text/javascript"> 
    function buttonClick() { 
     var cb = document.getElementById('<%= CheckBox1.ClientID %>'); 
     cb.disabled = false; 
     cb.parentNode.disabled = false; 
    }  
    </script> 

</head> 
<body onload="document.getElementById('<%= CheckBox1.ClientID %>').disabled = true;"> 
    <form id="form1" runat="server"> 
    <div> 
    <asp:checkbox id="CheckBox1" runat="server" checked="true" /> 
    <asp:button id="Button1" runat="server" text="Button" onclientclick="buttonClick(); return false;" /> 
    <asp:button id="Button2" runat="server" text="Button2" onclick="button2Click" /> 
    </div> 
    </form> 
</body> 
+0

Tôi đã làm một cái gì đó tương tự như trong dự án của tôi. Nó không phải là rất tốt cho an ninh tuy nhiên. Nếu người dùng tắt Javascript, về cơ bản anh ta có thể kiểm tra hộp và nhấn Lưu mà không bị cản trở. –

1

Tôi không thể hiểu được vấn đề một cách chính xác, nhưng có thể không phải bạn chỉ cần sử dụng các mẫu từ các yêu cầu để lấy giá trị CheckBox? Vì vậy, trong button2Click() trong các mã sau tệp bạn muốn làm điều này:

Request.Form[CheckBox1.UniqueID] 
+2

Không, trình duyệt không bắt buộc phải trả lại giá trị của các phần tử biểu mẫu bị vô hiệu. – Tommy

12

Tôi đã có một vấn đề tương tự như này, nơi tài sản của đối tượng CheckBox Kiểm tra đã không được cập nhật một cách chính xác, để có được giá trị thực tế bạn có thể đăng tải kiểm tra:

Request.Form[CheckBox1.UniqueID] 

nó sẽ được 'bật' nếu hộp được chọn và null nếu không.

+0

(6 năm sau ...) Thật kỳ quặc. Ứng dụng ASP.Net của tôi là "đôi khi" báo cáo giá trị kiểm tra sai cho hộp kiểm ASP.Net của tôi và đôi khi * đề xuất này không hoạt động ... lần khác nó ném ngoại lệ vì giá trị của điều khiển này không được tìm thấy trong Yêu cầu. Giá trị biểu mẫu ... –

0

Bạn có thể sử dụng một cái gì đó như thế này.

if ((Request.Params["Checkbox1"] ?? "").ToString() == "on") 

Nếu nó không được kiểm tra, nó sẽ không vượt qua nó ngay từ đầu, nhưng điều này nên tính đến điều đó.

0

Đây là giải pháp thay thế nếu bạn cần tránh biên dịch lại mã nguồn của mình. Nó chỉ cho phép hộp kiểm cho một phần hai giây trước khi gửi biểu mẫu. 1: Thêm các tham số sau đây để nút gửi của bạn: OnClientClick="EnableCheckbox()" 2: Thêm chức năng đơn giản này ở đâu đó trên trang để kích hoạt nó

<script> 
     function EnableCheckbox() { 
      document.getElementById("<%=chkMyCheckbox.clientID %>").disabled = false; 
     } 
</script>