VB.NET - 执行回发时复选框被禁用

VB.NET - Checkbox disabled while doing postback

我有一个自动post返回的复选框。此复选框将 hide/show 我的数据网格中的一列。我希望我的复选框 disabled/read 仅在出现 post 返回时出现,以避免双击或服务器错误。我知道禁用复选框将不会通过 post 保留值。根据我在其他类似问题中读到的内容,我需要创建一个隐藏的输入并为其分配我的复选框的值。我现在如何拥有它,隐藏输入在 postback 之后始终具有 false 值。任何 advice/help 将不胜感激。

*只显示相关代码。

ASPX:

<asp:CheckBox ID="chkbxEmailPhone" runat="server" Text="Include Telephone & E-Mail" AutoPostBack="true" CssClass="bold tdfont10" value="<%=hidPhoneEmail%>" name="EmailPhoneCheck"></asp:CheckBox>

<input type="hidden" id="hidChkBxValue" value=" <%=hidPhoneEmail%>" name="EmailPhoneCheck"/>

Javascript:

function fnDisableChkBox(){
    if(document.getElementById("chkbxEmailPhone").checked = true){
        document.getElementById("hidChkBxValue").value = "true";
    }
    else {
        document.getElementById("hidChkBxValue").value = "false";
    }

    document.getElementById("chkbxEmailPhone").disabled = true;
}

VB.NET: 在Page_PreRender

'Declared normally - not in prerender
Public hidPhoneEmail As String = String.Empty 

chkbxEmailPhone.Attributes.Add("onChange", "fnDisableChkBox(this);")

hidPhoneEmail = Request.Form("hidPhoneEmail")

If hidPhoneEmail = "true" Then
    chkbxEmailPhone.Checked = True
Else
    chkbxEmailPhone.Checked = False
End If

尝试使用 HiddenField 控件,因为它很容易在 PostBack 上获取它的值。

<asp:CheckBox ID="chkbxEmailPhone" runat="server" Text="Include Telephone & E-Mail" AutoPostBack="true" value="<%=hidChkBxValue%>" name="EmailPhoneCheck"></asp:CheckBox>
<asp:HiddenField ID="hidChkBxValue" runat="server" Value="" />

那么你的 PreRender Event Handler 就变成了下面这样。您不需要第三个隐藏值 "hidPhoneEmail",因此只需将 hidChkBxValue.Value = "false" 替换为您首先确定的值。

Private Sub Page_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
    chkbxEmailPhone.Attributes.Add("onChange", "fnDisableChkBox(this);")

    If hidChkBxValue.Value = String.Empty Then
        'How do you figure out the original value?
        hidChkBxValue.Value = "false"
    End If

    chkbxEmailPhone.Checked = CBool(hidChkBxValue.Value)
End Sub

只要 ASP.net 没有更改您的 ID,您的 JavaScript 功能应该没问题。

NoAlias - 我使用了您建议的更改,因此我的代码如下所示。

我第一次单击复选框时效果很好,从未选中到选中。之后,当我尝试取消选中该框时,chkbxEmailPhone.Checked 的值变为 False,但隐藏字段通过 post 返回保持为真,并且在 pre_render 中复选框切换回 chkbxEmailPhone.Checked = 正确。

我认为问题出在我的 javascript 上,因为隐藏字段在第一个 post 返回后仍然为真,无论如何。 Javascript 不是我的强项,所以我不确定如何解决。

ASPX:

<asp:CheckBox ID="chkbxEmailPhone" runat="server" Text="Include Telephone & E-Mail" AutoPostBack="true" CssClass="bold tdfont10" Value=""></asp:CheckBox>

<asp:HiddenField ID="hidChkBxValue" runat="server" Value="" /> 

Javascript:

function fnDisableChkBox(){

    if(document.getElementById("chkbxEmailPhone").checked == true){
        document.getElementById("hidChkBxValue").value = "true";
        }
    else{
        document.getElementById("hidChkBxValue").value = "false";
        }

   document.getElementById("chkbxEmailPhone").disabled = true;
    }

VB.Net - Pre_Render

chkbxEmailPhone.Attributes.Add("onChange", "return buttonClick(this);")

If hidChkBxValue.Value = String.Empty Then
    hidChkBxValue.Value = "false"
End If
chkbxEmailPhone.Checked = CBool(hidChkBxValue.Value)