所以我有一个名为“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的衍生行为。
所以我改为:
return string.Format("this.disabled=true;{0}", Page.ClientScript.GetPostBackEventReference(GetPostBackOptions()));
现在验证在客户端正常启动,但是没有重新启用该按钮,FML =)
我认为我现在需要智能化,并说“如果验证失败,请重新启用按钮”。
有什么想法吗?
答案 0 :(得分:3)
您应该只需添加内联Page_ClientValidate
方法即可。我从未尝试过这样做,所以它可能不起作用:
return string.Format("if (Page_ClientValidate()) { this.disabled=true; {0} } else return false;",
Page.ClientScript.GetPostBackEventReference(this, string.Empty));
您可能不得不使用它或添加一些检查以支持GroupValidation,但我认为这会让您走上正确的道路。
编辑:我已更新答案,并将您禁用为if,只有在Page_ClientValidate
失败时才会被禁用。
查看此链接,因为它正在执行您正在寻找的内容我认为并说明我对Page_ClientValidate
的含义:
http://msmvps.com/blogs/anguslogan/archive/2004/12/22/27223.aspx