ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-05 04:37:35  阅读:284  来源: 互联网

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


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有