9

ASP.NET中在点击按钮后将该按钮设为不可用的若干情况

by 刘武 7. 七月 2009 21:33

项目中经常出现用户重复提交的情况,为了防止这种情况,最常用的方法就是在用户点击按钮后将该按钮设为不可用,笔者在实际开发当中遇到了多种不同的情况,在此做个小结,以供参考。

第一种情况是非submit类型的按钮

这种情况比较简单,只要在客户端添加事件,将按钮设为不可用就可以了。看下面的代码:


<form id="form1" runat="server">
        <asp:Label ID="lbl" runat="server"></asp:Label>
        <asp:Button ID="btn" runat="server" Text="Test"
            OnClick="btn_Click" OnClientClick="this.disabled=true"
            UseSubmitBehavior="false" />
</form>
protected void btn_Click(object sender, EventArgs e)
{
    System.Threading.Thread.Sleep(1000);
    lbl.Text = DateTime.Now.ToString();
}

第二种情况是submit类型的按钮

此时第一种方法就不行了,按钮被设为DISABLED之后就无法完成提交,我们可以适当修改代码:


<form id="form1" runat="server">
    <asp:Label ID="lbl" runat="server"></asp:Label>
    <asp:Button ID="btn" runat="server" Text="Test"
        OnClick="btn_Click"/>
</form>
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        btn.OnClientClick = "this.disabled=true;" +
            GetPostBackEventReference(btn);
    }
}
与第一种方法不同的是我们在Page_Load中给按钮添加客户端事件,并附加了GetPostBackEventReference。但这样做还有个缺陷,在第一提交回发完成以后,再点击按钮就会失败,因此我们需要去掉if (!Page.IsPostBack)这句,也就是每次回发都要重复绑定客户端事件。

第三种情况跟第一种类似,只是多了个UpdatePanel


<asp:UpdatePanel ID="up1" runat="server" >
    <ContentTemplate>
        <asp:Label ID="lbl" runat="server"></asp:Label>
        <asp:Button ID="btn" runat="server" Text="Test"
            OnClick="btn_Click"
            OnClientClick="this.disabled=true;"
            UseSubmitBehavior="false" />
    </ContentTemplate>
</asp:UpdatePanel>

第四种情况也是在UpdatePanel里面,不过和第二种情况一样,也是Submit类型的按钮

和第二种情况不同的是,我们只需要在第一次加载的时候绑定客户端事件就可以了,即在 if (!Page.IsPostBack){}中绑定事件。

第五种和第四种不同的是,按钮在UpdatePanel外面,通过触发器来刷新指定的UpdatePanel

如果按第四种的方法,可以在点击按钮后设为不可用,但回发完成以后该按钮不会恢复可用状态:


<asp:UpdatePanel ID="up1" runat="server">
    <ContentTemplate>
        <asp:Label ID="lbl" runat="server"></asp:Label>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btn"
            EventName="Click" />
    </Triggers>
</asp:UpdatePanel>
<asp:Button ID="btn" runat="server" Text="Test"
    OnClick="btn_Click" />

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        btn.OnClientClick = "this.disabled=true;" +
            GetPostBackEventReference(btn);
    }
}

protected void btn_Click(object sender, EventArgs e)
{
    System.Threading.Thread.Sleep(1000);
    lbl.Text = DateTime.Now.ToString();
}

为了解决这个问题,最简单的方法就是将该按钮放在另一个UpdatePanel里面,这样每次都可以恢复原状态了。另外还可以根据Atlas的页面周期,在提交完成以后显式将该按钮设为可用。

Tags: , ,

技术生涯

评论

ad
ad
2009-8-24 10:20:16 回复

多线程重要不

liuwu
liuwu
2009-8-24 20:19:50 回复

不知道你说的多线程是指哪方面

trackback
blue.net
2009-11-2 10:00:25 回复

ASP.NET中在点击按钮后将该按钮设为不可用的若干情况

项目中经常出现用户重复提交的情况,为了防止这种情况,最常用的方法就是在用户点击按钮后将该按钮设为不可用,笔者在实际开发当中遇到了多种不同的情况,在此做个小结,以供参考。
第一种情况是非submit类...

菜鸟
菜鸟
2010-4-29 10:21:49 回复

不知道您所说的能用在asp中吗?如果是asp里,您上述的代码能直接用吗?谢谢!

衰哥
衰哥
2010-5-7 2:03:56 回复

很好很强大  多谢您的指点

衰哥
衰哥
2010-5-7 11:52:53 回复

我想问   我用第5中方法  

我有2个按钮,一个签到,一个签退,都被updatePanel控制

我想实现 点击一个签到的时候签到不可用,签退可用,点击签退的时候签到可用,怎么做、?

liuwu
liuwu
2010-5-7 12:32:29 回复

可以使用页面周期事件来实现,具体可以查看我的另外一篇文章:atlas 客户端页面周期事件及实践:防止重复提交

bamboo
bamboo
2010-5-17 1:05:50 回复

有没什么方法可以彻底解决1.6版本安装后的乱码问题!能否发到我的邮箱,非常感谢!

liuwu
liuwu
2010-5-17 22:59:19 回复

如果启用了HTTP压缩,则会出现乱码,你可以禁用该选项。或者也可以修改源代码,具体位置我不记得了,你可以搜索 System.Text.Encoding.Default,然后把他改城UTF8就可以了

添加评论


(将显示你的Gravatar图标)

biuquote
  • 评论
  • 在线预览
Loading



Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft