2014-06-26 17 views
6

Tôi đang gặp một vấn đề lạ với trạng thái kích hoạt asp.net của radio.máy chủ asp.net bên bị vô hiệu hóa Radiobutton kích hoạt trên phía khách hàng

Mã trong trang .aspx:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="testradioButton.WebForm1" %> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.1.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $('#radYes').change(function() { gererEtat(); }); 
      $('#radNo').change(function() { gererEtat(); }); 
     }); 
     function gererEtat() { 
      $('#radDisabledYes').prop('disabled', !$('#radYes').prop('checked')); 
      $('#radDisabledNo').prop('disabled', !$('#radYes').prop('checked')); 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:radiobutton ID="radYes" runat="server" GroupName="test" Text="yes"></asp:radiobutton> 
     <asp:radiobutton ID="radNo" runat="server" GroupName="test" Text="No"></asp:radiobutton> 
    </div> 
    <div> 
     <asp:radiobutton ID="radDisabledYes" runat="server" GroupName="test2" Text="yes"></asp:radiobutton> 
     <asp:radiobutton ID="radDisabledNo" runat="server" GroupName="test2" Text="No"></asp:radiobutton> 
    </div> 
    <asp:LinkButton ID="lnktoto" runat="server" Text="Submit"></asp:LinkButton> 
    </form> 
</body> 
</html> 

Và Mã Đằng sau:

Public Class WebForm1 
Inherits System.Web.UI.Page 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     radDisabledYes.Enabled = radYes.Checked 
     radDisabledNo.Enabled = radYes.Checked 
    End If 
    Stop 
End Sub 

Private Sub Radiobutton1_CheckedChanged(sender As Object, e As EventArgs) Handles radYes.CheckedChanged, radNo.CheckedChanged 
    radDisabledYes.Enabled = radYes.Checked 
    radDisabledNo.Enabled = radYes.Checked 
End Sub 

Private Sub lnktoto_Click(sender As Object, e As EventArgs) Handles lnktoto.Click 
    Stop 
End Sub 
End Class 

Về phía server, tôi vô hiệu hóa nút radio trên nạp đầu tiên. Tôi có điều kiện tương tự trong javascript. Vì vậy, ở phía khách hàng, nếu người dùng nhấp vào Có, tôi bật một số điều khiển. Tôi làm như vậy ở phía máy chủ. Nó hoạt động tốt với tất cả các loại điều khiển ngoại trừ nút radio.

Giả sử khi tải, tôi tắt các nút radio. Về phía khách hàng, dựa trên đầu vào của người dùng, tôi kích hoạt chúng (trong javascript). Người dùng đã kiểm tra nút radio và gửi trang. Ở phía máy chủ, nút radio bị tắt và không được chọn. Tôi có mã kiểm tra các điều kiện và kích hoạt nó. Nhưng nút radio vẫn chưa được chọn. Tôi hiểu tại sao, máy chủ bỏ qua trạng thái đã chọn vì lúc đầu, nó nghĩ rằng nó bị vô hiệu hóa. Có cách nào để làm cho công việc này? Tôi biết máy chủ đang nhận trạng thái được kiểm tra vì khi tôi kiểm tra Request.Form, tôi thấy radDisable = Có.

Cảm ơn sự giúp đỡ của bạn.

+0

jsfiddle được cung cấp cho thấy bạn không sử dụng nút radio asp. Nó là điều khiển đầu vào html đơn giản. Làm thế nào bạn truy cập nó trên máy chủ? Bạn đã sử dụng thuộc tính runat = "server" trong html của mình chưa? – ataurrehman

+0

Tôi không thể đặt mã asp.net trong jsfiddle (hoặc có thể?). Tôi đang sử dụng Nút radio asp. –

+0

tất nhiên bạn không thể. Đã được yêu cầu xác nhận. thử vô hiệu hóa ViewState cho các nút radio đó và thực hiện tương tự. Không tắt lượt xem cho toàn bộ trang. Chỉ cần vô hiệu hóa trạng thái xem nút radio. – ataurrehman

Trả lời

1

Đây là hack bạn đang tìm kiếm :)

Public Class WebForm1 
Inherits System.Web.UI.Page 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If radYes.Checked Then 
     radDisabledYes.InputAttributes.Remove("disabled") 
     radDisabledNo.InputAttributes.Remove("disabled") 
    Else 
     radDisabledYes.InputAttributes("disabled") = "disabled" 
     radDisabledNo.InputAttributes("disabled") = "disabled" 
    End If 
    Stop 
End Sub 

Private Sub Radiobutton1_CheckedChanged(sender As Object, e As EventArgs) Handles radYes.CheckedChanged, radNo.CheckedChanged 
    ' not really needed anymore, but lets leave it in here for fun! 
End Sub 

Private Sub lnktoto_Click(sender As Object, e As EventArgs) Handles lnktoto.Click 
    Stop 
End Sub 
End Class 

này về cơ bản bỏ qua kiểm tra an toàn NET của liên quan đến kiểm soát người tàn tật. Các điều khiển vẫn được kích hoạt/vô hiệu hóa một cách thích hợp, nhưng bạn đang làm như vậy mà không gây rối với tài sản WebControl.Enabled.

+0

Sẽ kiểm tra điều này. Tôi có thể quá tải kiểm soát RadioButton và thay đổi cách cho phép làm việc với câu trả lời của bạn. –

+0

Tôi bỏ phiếu cho câu trả lời này vì nó là một trong đó là dễ dàng hơn để đóng gói trong một điều khiển khác để phát triển sẽ không có cùng một vấn đề như tôi. –

0

ASP.NET có thể thực sự hoang tưởng (và đúng như vậy) về việc đăng lại các điều khiển bị tắt ban đầu. Vì vậy, thay vì thực sự vô hiệu hóa chúng - mô phỏng hiệu ứng. Ví dụ. đặt thuộc tính onfocus = "this.blur()" - điều này sẽ ngăn việc nhấp vào nút. Và khi bạn cần bật nút - hãy xóa thuộc tính.

+0

Điều tôi không thích với giải pháp này là các nút radio sẽ không có kiểu bị tắt. Nhưng tôi thích một phần của việc không vô hiệu hóa chúng trong mã phía sau. Đó là những gì tôi đã làm trong javascript, tôi vô hiệu hóa chúng, ở phía máy chủ, chúng luôn được kích hoạt. –

0

Dường như với tôi rằng hành vi mã của bạn có thể chấp nhận được cho đến khi máy chủ không thể xác định các thay đổi trạng thái của nút radio mà nó cho là đã bị tắt.

Tại sao không chỉ giữ nút radio bị tắt và bị tắt trong nền? Khi bạn muốn giao diện bị tắt, hãy bỏ ẩn thiết lập đó và ẩn các cài đặt thực bằng JavaScript. Sau đó, bạn không bao giờ gặp phải một vấn đề với các hình thức vô hiệu hóa đi đến máy chủ.

Chỉnh sửa: Khi xem lại câu hỏi của bạn, tôi tự hỏi về việc cần vô hiệu hóa mọi thứ ở phía máy chủ để bắt đầu. Có thể có một nguy cơ bảo mật mà tôi không biết. Một sự lựa chọn thay thế có thể là để lại các buttonset kích hoạt serverside và vô hiệu hóa với javascript khi tải tài liệu.

+0

Tôi thích Chỉnh sửa của bạn bởi vì đây là những gì tôi đã kết thúc. Nhưng trong tổ chức tôi làm việc cho, vẫn còn quy tắc này nói rằng mọi thứ phải tiếp tục hoạt động ngay cả khi người dùng đã tắt Javascript. Về mặt lý thuyết, tôi không thể dựa vào JS. –

0

tôi có một giải pháp Trickey chút của nó, nhưng nó có thể giúp bạn ra ngoài

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#radYes').change(function() { gererEtat(); }); 
     $('#radNo').change(function() { gererEtat(); }); 

     // restore radio button disable status on document ready 
     var status = $("#txtradioStatus").val() == "true" ? true : false; 
     $('#radDisabledYes').prop('disabled', !status); 
     $('#radDisabledNo').prop('disabled', !status); 

    }); 
    function gererEtat() { 
     $('#radDisabledYes').prop('disabled', !$('#radYes').prop('checked')); 
     $('#radDisabledNo').prop('disabled', !$('#radYes').prop('checked')); 
     // store radio button status in hidden field 
     $("#txtradioStatus").val($('#radYes').prop('checked')); 
    } 

</script> 



<div> 
    <asp:radiobutton ID="radYes" runat="server" GroupName="test" Text="yes"></asp:radiobutton> 
    <asp:radiobutton ID="radNo" runat="server" GroupName="test" Text="No"></asp:radiobutton> 
</div> 
<div> 
    <asp:radiobutton ID="radDisabledYes" runat="server" GroupName="test2" Text="yes"></asp:radiobutton> 
    <%-- take hidden field that you can keep status of radio button after postback--%> 
    <input type="hidden" runat="server" value="true" id="txtradioStatus" /> 
    <asp:radiobutton ID="radDisabledNo" runat="server" GroupName="test2" Text="No"></asp:radiobutton> 
</div> 
<asp:LinkButton ID="lnktoto" runat="server" Text="Submit"></asp:LinkButton> 
1
$(document).ready(function() { 
    $('#<%=radYes.ClientID%>').change(function() { gererEtat(); }); 
    $('#<%=radNo.ClientID%>').change(function() { gererEtat(); }); 
    function gererEtat() { 
    $('#<%=radDisabledYes.ClientID%>').prop('disabled', !$('#<%= radYes.ClientID%>').prop('checked')); 
    $('#<%=radDisabledNo.ClientID%>').prop('disabled', !$('#<%=radYes.ClientID%>').prop('checked')); 
    } 
}); 

Sử dụng 'ClientID' để lựa chọn kiểm soát của bạn trong mã jquery vì kiểm soát là kiểm soát máy chủ.

0

submitdisabledcontrols = "true" điều này sẽ giải quyết được sự cố của bạn. Làm theo các bước dưới đây.

Lý do là, bạn đã tắt điều khiển từ phía máy chủ, ngay cả khi bạn đã bật nó từ ứng dụng khách bằng JQuery, SERVER KHÔNG BIẾT VỀ CNTT. Do đó, nó giữ nguyên giá trị vì nó không mong muốn thay đổi giá trị của một điều khiển bị vô hiệu hóa.

Có hai việc cần làm.

Đầu tiên đang tải trang remove. (Sự kiện Cũng Radiobutton1_CheckedChanged không cần thiết)

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
    'If Not IsPostBack Then 
    ' radDisabledYes.Enabled = radYes.Checked 
    ' radDisabledNo.Enabled = radYes.Checked 
    'End If 
End Sub 

Sau đó, thay đổi mã phía khách hàng để

<script type="text/javascript"> 
    $(document).ready(function() { 

     $('#radYes').change(function() { gererEtat(!$('#radYes').prop('checked')); }); 
     $('#radNo').change(function() { gererEtat(!$('#radYes').prop('checked')); }); 
     if (!$('#radYes').prop('checked')) { 
      gererEtat(true); 
     } 
    }); 
    function gererEtat(isEnable) { 
     $('#radDisabledYes').prop('disabled', isEnable); 
     $('#radDisabledNo').prop('disabled', isEnable); 
    } 
</script> 

cuối cùng trong các yếu tố hình thức thêm submitdisabledcontrols = thuộc tính "true" .

<form id="form1" runat="server" submitdisabledcontrols="true" > 

chạy và kiểm tra mã sẽ hoạt động.

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