【问题标题】:ASP.NET Custom Button Control - How to Override OnClientClick But Preserve Existing Behaviour?ASP.NET 自定义按钮控件 - 如何覆盖 OnClientClick 但保留现有行为?
【发布时间】:2011-04-01 10:55:41
【问题描述】:

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

不会应用回发选项的衍生行为。

所以我把它改成了这样:

return string.Format("this.disabled=true;{0}", Page.ClientScript.GetPostBackEventReference(GetPostBackOptions()));

现在验证在客户端正确触发,但按钮没有重新启用,FML =)

我想我现在甚至需要变得聪明,并说“如果验证失败,请重新启用按钮”。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您应该可以只添加 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

    【讨论】:

    • 你读过我的更新吗?验证正在工作 - 如果验证失败,我只需要重新启用。我有一个自定义的 GetPostBackOptions 方法,所以我不需要使用 GetPostBackEventReference。
    • @RPM1984 这就是为什么我说要内联添加Page_ClientValidate 选项。如果失败(返回 false),则禁用并返回 false。我不确定如何以任何其他方式从客户端验证中获取结果,除非Page.ClientScript.GetPostBackEventReference 返回它可能的错误,然后您可以触发它。这些只是在黑暗中刺伤:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多