2014-06-26 12 views
6

Ich habe ein seltsames Problem mit asp.net aktiviert Status von Radiobutton.asp.net Server-Seite deaktiviert Radiobutton auf Client-Seite aktiviert

-Code in ASPX-Seite:

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

Und-Code Behind:

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 

Auf Server-Seite, deaktiviere ich Radio-Buttons auf der ersten Last. Ich habe die gleichen Bedingungen in Javascript. Wenn der Benutzer also auf der Clientseite auf Ja klickt, aktiviere ich einige Steuerelemente. Ich mache das gleiche auf der Serverseite. Es funktioniert gut mit allen Arten von Steuerelementen außer Radio Button.

Lassen Sie uns sagen, dass ich unter Last, Radio-Tasten deaktivieren. Auf Client-Seite, basierend auf Benutzereingaben, aktiviere ich sie (in Javascript). Benutzer hat ein Optionsfeld aktiviert und eine Seite gesendet. Auf der Serverseite ist das Optionsfeld deaktiviert und deaktiviert. Ich habe einen Code, der die Bedingungen überprüft und aktiviert. Aber der Radio-Button wird immer noch nicht überprüft. Ich verstehe, warum der Server den Status checked ignoriert, weil er zuerst denkt, dass er deaktiviert ist. Gibt es eine Möglichkeit, dies zum Funktionieren zu bringen? Ich weiß, dass der Server den überprüften Status erhält, da ich, wenn ich Request.Form überprüfe, radDisable = Yes sehe.

Danke für Ihre Hilfe.

+0

jsfiddle zur Verfügung gestellt zeigt, dass Sie nicht asp-Radio-Taste verwenden. Es ist eine einfache HTML-Eingabesteuerung. Wie greifen Sie auf den Server zu? Hast du das Attribut runat = "server" in deinem HTML verwendet? – ataurrehman

+0

Ich kann asp.net Code nicht in jsfiddle (oder kann ich?). Ich benutze asp Radio Button. –

+0

natürlich können Sie nicht. Um Bestätigung gebeten. versuchen Sie Viewstate für diese Radio-Buttons deaktivieren und das gleiche tun. Deaktiviere nicht die Sichtenanzeige für die ganze Seite. Deaktivieren Sie einfach den Ansichtszustand der Radio-Schaltflächen. – ataurrehman

Antwort

1

Hier ist die Hack Sie :) suchen sind

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 

Dies umgeht im Wesentlichen Sicherheitsprüfung .NET deaktiviert Kontrollen in Bezug auf. Die Steuerelemente sind weiterhin aktiviert/deaktiviert, aber Sie tun dies, ohne die Eigenschaft WebControl.Enabled zu stören.

+0

Wird dies testen. Ich könnte das RadioButton-Steuerelement überladen und ändern, wie die Arbeit mit Ihrer Antwort funktioniert. –

+0

Ich stimme für diese Antwort, denn es ist die eine, die leichter in ein anderes Steuerelement einzukapseln ist, so dass Entwickler nicht das gleiche Problem haben wie ich. –

0

ASP.NET kann wirklich paranoid (und zu Recht) über das Zurücksetzen ursprünglich deaktiviert Steuerelemente sein. Anstatt sie tatsächlich zu deaktivieren, simulieren Sie den Effekt. Z.B. Setzen Sie das Attribut onfocus = "this.blur()" - dies verhindert das Klicken auf die Schaltfläche. Und wenn Sie die Schaltfläche aktivieren müssen - entfernen Sie das Attribut.

+0

Was mir bei dieser Lösung nicht gefällt, ist, dass die Optionsfelder nicht den deaktivierten Stil haben. Aber ich mag den Teil, der sie im Code nicht deaktiviert. Das habe ich in Javascript getan, ich deaktiviere sie, auf der Serverseite sind sie immer aktiviert. –

0

Es scheint mir, dass Ihr Code-Verhalten akzeptabel ist, bis der Server Zustandsänderungen von Optionsfeldern nicht erkennen kann, von denen angenommen wird, dass sie deaktiviert sind.

Warum nicht einfach ein verstecktes und deaktiviertes Optionsfeld im Hintergrund behalten? Wenn Sie den deaktivierten Look sehen möchten, blenden Sie diesen ein und verstecken Sie die echten mit JavaScript. Dann tritt nie ein Problem mit deaktivierten Formularen auf, die auf den Server gehen.

Bearbeiten: Nach dem erneuten Blick auf Ihre Frage, frage ich mich über die Notwendigkeit, alles auf der Serverseite zu deaktivieren, um damit zu beginnen. Vielleicht gibt es ein Sicherheitsrisiko, das mir nicht bewusst ist. Eine andere Möglichkeit besteht darin, den Buttonsatz serverseitig aktiv zu lassen und beim Laden von Dokumenten mit Javascript zu deaktivieren.

+0

Ich mag deine Edit, weil das ist, was ich gelandet bin. Aber in der Organisation, für die ich arbeite, gibt es immer noch diese Regel, die besagt, dass alles kontinuierlich funktionieren muss, selbst wenn der Benutzer Javascript deaktiviert hat. Theoretisch kann ich mich nicht auf JS verlassen. –

0

Ich habe eine Lösung sein kleines Trickey wenig, aber es kann Ihnen helfen,

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

Verwenden ‚ClientID‘ für Ihre Steuer Auswahl in Jquery-Code, weil Steuerserver Kontrolle ist.

0

submitdisabledcontrols = "true" das wird Ihr Problem lösen. Befolgen Sie die folgenden Schritte.

Grund ist, haben Sie die Kontrolle von der Server-Seite deaktiviert, auch wenn Sie es von Client mit JQuery aktiviert hat, weiß Server nicht darüber. Daher behält es den gleichen Wert bei, da es nicht erwartet, den Wert eines deaktivierten Steuerelements zu ändern.

Es gibt zwei Dinge zu tun.

Entfernen Sie zuerst Seite zu laden Code. (Auch Radiobutton1_CheckedChanged Ereignis nicht erforderlich)

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 

Dann Client-Seite Code ändern zu

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

schließlich in Form Element hinzufügen die submitdisabledcontrols = "true" -Attribut .

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

ausführen und testen Sie den Code, der es funktioniert.

Verwandte Themen