2014-06-26 30 views
6

我有一个奇怪的问题,启用asp.net的单选按钮状态。asp.net服务器端禁用在客户端启用Radiobutton

代码在.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> 

和代码背后:

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 

在服务器端,我禁用第一负载单选按钮。我在JavaScript中有相同的条件。所以在客户端,如果用户单击是,我启用一些控件。我在服务器端做同样的事情。它适用于除单选按钮以外的所有类型的控件。

让我说负载,我禁用单选按钮。在客户端,基于用户输入,我启用它们(在JavaScript中)。用户检查了一个单选按钮并提交页面。在服务器端,单选按钮被禁用并且未被选中。我有代码检查条件并启用它。但单选按钮仍未被检查。我明白为什么,服务器忽略检查状态,因为一开始它认为它被禁用。有没有办法做到这一点?我知道服务器正在接受检查状态,因为当我检查Request.Form时,我看到radDisable = Yes。

感谢您的帮助。

+0

jsfiddle提供了显示您没有使用asp单选按钮。这是简单的html输入控件。你如何在服务器上访问它?你有没有在你的html中使用runat =“server”属性? – ataurrehman

+0

我不能把asp.net代码放入jsfiddle(或者我可以吗?)。我正在使用asp单选按钮。 –

+0

当然你不能。要求确认。尝试禁用这些单选按钮的视图状态,并执行相同的操作。不要禁用整个页面的视图。只需禁用单选按钮视图状态。 – ataurrehman

回答

1

这里是你正在寻找:)

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 

这基本上绕过.NET的关于禁用的控件安全检查的黑客。这些控件仍然可以正常启用/禁用,但是您的操作不会影响WebControl.Enabled属性。

+0

会测试这个。我可以重载RadioButton控件并更改如何使用您的答案。 –

+0

我投这个答案是因为它更容易封装在另一个控件中,所以开发人员不会像我一样遇到问题。 –

0

对于最初禁用的控件的回复,ASP.NET可能是非常偏执的(并且正确如此)。因此,而不是实际禁用它们 - 模拟效果。例如。设置属性onfocus = "this.blur()" - 这将防止点击按钮。当你需要启用按钮 - 删除属性。

+0

我不喜欢这个解决方案是单选按钮不会有残疾的风格。但我喜欢在代码背后禁用它们的部分。这就是我在JavaScript中所做的,我禁用了它们,在服务器端,它们始终处于启用状态。 –

0

在我看来,您的代码行为是可以接受的,直到服务器无法识别它假定禁用的单选按钮的状态更改。

为什么不在后台保留隐藏和禁用的无线电按钮集?当您想要禁用外观时,请使用JavaScript取消隐藏设置并隐藏真实内容。那么你永远不会遇到禁用表单到服务器的问题。

编辑: 再次查看您的问题后,我想知道是否需要在服务器端禁用任何东西来开始。也许有一种我不知道的安全风险。另一种选择可能是在启用按钮集的服务器端时,在文档加载时禁用JavaScript。

+0

我喜欢你的编辑,因为这是我结束了。但在我工作的组织中,即使用户禁用Javascript,仍然存在这样的规则,即所有内容都必须继续工作。所以在理论上,我不能依赖JS。 –

0

我有一个解决方案的点点trickey但它可以帮助你

<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')); 
    } 
}); 

使用“客户端ID”在jQuery代码的控制选择,因为控件是服务器控件。

0

submitdisabledcontrols =“true”这将解决您的问题。按照下面给出的步骤。

原因是,即使您使用JQuery从客户端启用它,SERVER也不知道它是否已从服务器端禁用了控件。因此它保持相同的值,因为它不希望更改禁用控件的值。

有两件事情要做。

首先删除页面加载代码。(不需要另外Radiobutton1_CheckedChanged事件)

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 

然后改变客户端代码

<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> 

最后在形式元素添加submitdisabledcontrols = “true” 属性。

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

运行并测试它将工作的代码。