ASP.NET自定义按钮控件 – 如何覆盖OnClientClick但保留现有行为?
作者:互联网
所以我有一个名为“SafeClickButton”的ASP.NET 4自定义控件,它旨在覆盖客户端点击(OnClientClick)的默认行为.
基本上我试图在点击时禁用按钮,然后执行任何现有功能(验证,回发等).
它看起来正确呈现HTML(onclick =“this.disabled = true; __ doPostback …),并且它正确禁用,但问题在于页面验证.如果页面上的任何验证失败,其发布返回然后显示验证错误(应该在客户端进行而不需要回发).
这是自定义控件的代码.
public class SafeClickButton : Button
{
public override string OnClientClick
{
get
{
return string.Format("this.disabled=true;{0}", Page.ClientScript.GetPostBackEventReference(this, string.Empty));
}
set
{
base.OnClientClick = value;
}
}
protected override PostBackOptions GetPostBackOptions()
{
PostBackOptions options = new PostBackOptions(this, string.Empty) {ClientSubmit = true};
if (Page != null)
{
if (CausesValidation && (Page.GetValidators(ValidationGroup).Count > 0))
{
options.PerformValidation = true;
options.ValidationGroup = ValidationGroup;
}
if (!string.IsNullOrEmpty(PostBackUrl))
{
options.ActionUrl = HttpUtility.UrlPathEncode(ResolveClientUrl(PostBackUrl));
}
}
return options;
}
}
我究竟做错了什么?
编辑
好的,所以我发现了部分问题:
return string.Format("this.disabled=true;{0}", Page.ClientScript.GetPostBackEventReference(this, string.Empty));
不会应用postbackoptions的devied行为.
所以我改成了这个:
return string.Format("this.disabled=true;{0}", Page.ClientScript.GetPostBackEventReference(GetPostBackOptions()));
现在验证在客户端正常启动,但该按钮未重新启用,FML =)
我想我现在需要更聪明,并说“如果验证失败,重新启用按钮”.
有任何想法吗?
解决方法:
您应该能够直接添加Page_ClientValidate方法.我从来没有尝试过,所以它可能不起作用:
return string.Format("if (Page_ClientValidate()) { this.disabled=true; {0} } else return false;",
Page.ClientScript.GetPostBackEventReference(this, string.Empty));
您可能不得不弄乱它或添加一些支持以支持GroupValidation,但我认为这将使您走上正确的道路.
编辑:我已经更新了答案并移动你禁用if if它只在Page_ClientValidate失败时被禁用.
查看此链接,因为它正在执行您正在寻找的内容,并且说明了我对Page_ClientValidate的含义:
http://msmvps.com/blogs/anguslogan/archive/2004/12/22/27223.aspx
标签:javascript,asp-net,button,postback,custom-controls 来源: https://codeday.me/bug/20190705/1383812.html