在禁用客户端后,无法获得ASP按钮以从代码隐藏中启用自身

时间:2016-02-18 10:11:34

标签: html asp.net webforms

我对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属性。

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

您可以修改属性......

 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已经有几年了,所以这是有根据的猜测

答案 2 :(得分:0)

我还希望能够通过更新面板中的代码隐藏来控制按钮禁用状态。我使用了一个函数来注入客户端的onclick处理程序属性,该属性将设置disable属性以防止多次单击,并将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);
}