【问题标题】:Can't get an ASP Button to enable itself from code-behind after disabling it client-side在客户端禁用 ASP Button 后,无法从代码隐藏中启用它自己
【发布时间】:2016-02-18 10:11:33
【问题描述】:

我对 ASP.NET 还很陌生,所以这肯定是由于我缺乏了解。

我遇到了一个同时设置了 OnClientClickOnClick 的 ASP 按钮:

<asp:Content ID="Content2" ContentPlaceHolderID="mainContent" runat="Server">
    <asp:UpdatePanel ID="upSendData" runat="server" UpdateMode="Conditional" RenderMode="Block">
        ...
    </asp:UpdatePanel>
    <asp:Button ID="btnSave" runat="server" 
                OnClientClick="if(!CanSave()){return false;}; DisableSaveButton();"
                OnClick="btnSave_Click" 
                Text="<%$ Resources: btnSave %>"
                CssClass="cmdFormButton"
                UseSubmitBehavior="false" 
                Width="220px" />
</asp:Content>

OnClientClick 调用一个禁用按钮的 JS 函数,以避免用户不小心点击多次:

function DisableSaveButton() {
    document.getElementById("<%=btnSave.ClientID %>").disabled = true;
}

然后代码隐藏OnClick 执行保存过程...但是如果出现故障,我想重新启用按钮。所以我这样做了:

protected void btnSave_Click(object sender, EventArgs e)
{
    if (SaveData())
    {
        // Redirects to another page
    }
    else
    {
        btnSave.Enabled = true;  // This is "true" already
    }
}

但它不起作用。客户端代码在代码隐藏之前正确执行,并且按钮被禁用。但是如果我调试代码隐藏,btnSave.Enabled 已经返回true,并且它不会重新启用它。

我知道 ASP Enabled 属性和 HTML disabled 属性不一样,但我有点希望 ASP 知道如何处理。

另外,我不确定是否(或如何)可以从代码隐藏中访问 disabled 属性。

有什么想法吗?建议?提前致谢!

【问题讨论】:

  • 你能确认一下当前的行为吗?该按钮在提交时被禁用,但在 SavaData() == false? 时未重新启用?
  • 这是一个完整的回帖还是有UpdatePanel 或类似的东西?触摸按钮背后的代码中是否还有其他方法?
  • @user1429080 确实有一个UpdatePanel。有一些代码隐藏方法会与按钮的 Visible 属性混淆,但不会与 Enabled 属性混淆。
  • 我将编辑以向 asp 代码添加更多上下文
  • @user1429080 嗯,看起来按钮不在UpdatePanel 内,所以不确定它是否会影响这个

标签: html asp.net webforms


【解决方案1】:

我们终于设法解决了这个问题。这就像从后面的代码注册一个调用 JS 函数以启用按钮客户端的脚本一样“简单”。

CS:

protected void btnSave_Click(object sender, EventArgs e)
{
    if (SaveData())
    {
        // Redirects to another page
    }
    else
    {
        ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(),
            "showSaveButtons_" + this.ClientID, "EnableSaveButton();", true);
    }
}

ASPX:

function EnableSaveButton() {
    document.getElementById("<%=btnSave.ClientID %>").disabled = false;
}

【讨论】:

    【解决方案2】:

    你可以修改属性...

     else
        {
            btnSave.Enabled = true;  // This is "true" already
            btnSave.Attributes.Remove("disabled");
        }
    

    另外,您需要将UseSubmitBehavior="false" 应用到按钮上才能调用``后面的代码

    <asp:Button ID="btnSave" UseSubmitBehavior="false"  
                runat="server" Text="Button" OnClick="btnSave_Click" 
                OnClientClick="DisableSaveButton();" />
    

    我已经有几年没有使用 WebForms 了,所以这是一个有根据的猜测

    【讨论】:

    • 检查了UseSubmitBehavior,它已经是false。尝试删除该属性,但一开始就没有。 btnSave.Attributes 返回一个空集合。我将按钮的aspx代码添加到问题中。
    • 什么是!CanSave()
    • 这是一个检查数据是否有效的JS函数,以避免在我们知道它不起作用时向服务器发送保存请求。如果CanSave 返回false,它将按预期工作:按钮保持启用状态并且不调用代码隐藏保存代码。
    • 我已经在一个虚拟项目上进行了测试,它工作正常 - 你确定它正在访问 else 代码块吗?
    • 是的,它是......我猜控件的代码隐藏“版本”不知道JS脚本在客户端所做的更改,这是有道理的,但是代码- 似乎也没有注意到背后的变化。
    【解决方案3】:

    我还希望能够从更新面板中的代码隐藏控制按钮禁用状态。我使用了一个函数来注入一个客户端 onclick 处理程序属性,该属性将设置 disabled 属性以防止多次单击并将value 属性更改为“Saving”。然后在我的 OnClick 代码中,如果我设置 Enabled=false 并强制我的 UpdatePanel 更新 upSendData.Update(),这将强制面板以当前状态重绘所有控件。 btn1 被绘制启用,而 btn2 被禁用。值(文本)也自动重置。

    ASPX 页面

    <asp:UpdatePanel ID="upSendData" UpdateMode="Conditional">
    <ContentTemplate>
    ....
        <asp:Button ID="btn1" runat="server" Text="Email Instructions" OnClick="btn1_Click" Enabled="false" />        
        <asp:Button ID="btn2" runat="server" Text="Save" OnClick="btn2_Click" />
    </ContentTemplate>
    </asp:UpdatePanel>
    

    ASPX.CS

    public void disableSubmitButtonOnClick(Button objButton, String message = "Processing") {
            objButton.CausesValidation = false;
            string validationGroup = objButton.ValidationGroup;
            if (string.IsNullOrEmpty(validationGroup))
                objButton.Attributes.Add("onclick", String.Format("if (Page_ClientValidate()) {{this.value='{0}...';this.disabled=true;{1} }}", message, objButton.Page.ClientScript.GetPostBackEventReference(objButton, "").ToString()));
            else
                objButton.Attributes.Add("onclick", String.Format("if (Page_ClientValidate(\"{2}\")) {{this.value='{0}...';this.disabled=true; {1} }}", message, objButton.Page.ClientScript.GetPostBackEventReference(objButton, "").ToString(), validationGroup));
    }
    Page_Load()
    {
        if(!IsPostBack())
        {
            disableSubmitButtonOnClick(btn1);
            disableSubmitButtonOnClick(btn2);
        }
    }
    
    protected void btn2_Click()
    {
    btn2.Enabled = false;
    btn1.Enabled = true;
    upSendData.Update(); 
    }
    

    如果按钮在UpdatePanel之外,那么你需要RegisterClientScript来重置按钮状态(假设是jQuery):

    public void resetSubmitButton(Button objButton, Boolean state=true)
    {
        String sState = (!state).ToString().ToLower();
        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "reset" + objButton.ID, String.Format("$('#{0}').val('{1}');$('#{0}').attr('disabled', {2});", objButton.ClientID, objButton.Text, sState), true);
    }
    
    protected void btn_Click(object sender, EventArgs e)
    {
        resetSubmitButton((Button)sender);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多