我对ASP.NET很新,所以这肯定来自于我的缺乏理解。
我遇到了同时设置OnClientClick
和OnClick
的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
属性。
有什么想法吗?建议?提前谢谢!
答案 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);
}