ASP.NET自定义按钮控件 - 如何覆盖OnClientClick但保留现有行为?

时间:2010-08-20 01:46:01

标签: asp.net button custom-controls postback javascript

所以我有一个名为“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 =)

我认为我现在需要智能化,并说“如果验证失败,请重新启用按钮”。

有什么想法吗?

1 个答案:

答案 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