C# 自定义网络控制列在UpdatePanel';的异步回发触发器列表,但单击时仍会导致完整的同步页面刷新

C# 自定义网络控制列在UpdatePanel';的异步回发触发器列表,但单击时仍会导致完整的同步页面刷新,c#,asp.net,user-controls,triggers,updatepanel,C#,Asp.net,User Controls,Triggers,Updatepanel,我试图构建一个用户控件;一个可视的自定义链接按钮。一切都很好,直到UpdatePanels加入其中:我的FancyButtonUserControl导致页面刷新。为了进行比较,我还使用了一个传统的LinkButton,它可以按预期的方式工作 //Doesn't work: Causes whole page to refresh/reload. <as:FancyButton ID="fbUpload" runat="server" Text="FancyButton"/>

我试图构建一个用户控件;一个可视的自定义链接按钮。一切都很好,直到UpdatePanels加入其中:我的FancyButtonUserControl导致页面刷新。为了进行比较,我还使用了一个传统的LinkButton,它可以按预期的方式工作

//Doesn't work: Causes whole page to refresh/reload.
<as:FancyButton ID="fbUpload"
    runat="server" Text="FancyButton"/>

//Works as intended: Causes ajax refresh of Update Panel.
<asp:LinkButton ID="btnUpload" runat="server" Text="LinkButton" />

对此不是100%确定,但我猜问题在于导致回发的按钮是用户控件内部的私有按钮,您无法如此轻松地将其添加到触发器中

我能想到的最干净的解决方法是为自定义控件而不是用户控件创建一个从LinkButton继承的类。缺点:没有可视化设计器或标记页面

关于这个问题的快速谷歌搜索让我间接接触到了Microsoft Connect:


(除非你喜欢把头撞在墙上,否则不要阅读他从ASP.NET论坛链接的帖子)

对此不是100%确定,但我猜问题在于,导致回发的按钮是用户控件内部的私有按钮,你无法如此轻松地将其添加到触发器中

我能想到的最干净的解决方法是为自定义控件而不是用户控件创建一个从LinkButton继承的类。缺点:没有可视化设计器或标记页面

关于这个问题的快速谷歌搜索让我间接接触到了Microsoft Connect:


(除非你喜欢把头撞到墙上,否则不要阅读他从ASP.NET论坛链接的帖子)

ASP.NET updatepanel总是调用正常的回发和完整页面生命周期,唯一的区别是浏览器不会闪烁,因为它将以智能方式只重绘updatepanel的内容,不是整个页面。如果您的意思是页面正在执行其生命周期,那么David是正确的。如果你的意思是页面在闪烁,那么我不确定。我已经好几年没有使用UpdatePanel了,这是有充分理由的。当我说“页面刷新”时,我指的是“闪烁”,就像在“非异步”中一样。为清晰起见更新。ASP.NET updatepanel始终调用正常的回发和完整页面生命周期,唯一的区别是浏览器不会闪烁,因为它将以智能方式仅重新绘制updatepanel的内容,而不是整个页面。如果您指的是页面正在执行其生命周期,则David是正确的。如果你的意思是页面在闪烁,那么我不确定。我已经好几年没有使用UpdatePanel了,这是有充分理由的。当我说“页面刷新”时,我指的是“闪烁”,就像在“非异步”中一样。为清晰起见进行了更新。现在效果很好。此外,通过继承LinkButton而不是WebControl,我还可以删除该类中除
Render()
之外的所有方法。谢谢现在效果很好。此外,通过继承LinkButton而不是WebControl,我还可以删除该类中除
Render()
之外的所有方法。谢谢
<asp:UpdatePanel ID="upNewUpdatePanel" UpdateMode="Always" ChildrenAsTriggers="true"
    runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="fbUpload" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="btnUpload" EventName="Click" />
    </Triggers>
    <ContentTemplate>
        <asp:PlaceHolder ID="detailPlaceHolder" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>
using System;
using System.Web.UI.WebControls;
using System.Web.UI;


namespace Jake
{
    public class FancyButton : WebControl, INamingContainer
    {
        private LinkButton _btn;


        public string Text
        {
            get
            {
                EnsureChildControls();
                return _btn.Text;
            }
            set
            {
                EnsureChildControls();
                _btn.Text = value;
            }
        }

        public string OnClientClick
        {
            get 
            {
                EnsureChildControls();
                return _btn.OnClientClick;
            }
            set
            {
                EnsureChildControls();
                _btn.OnClientClick = value;
            }
        }

        public delegate void ClickEventHandler(object sender, EventArgs e);
        public event ClickEventHandler Click = delegate { };

        protected void _btn_Click(object sender, EventArgs e)
        {
            Click(this, e);
        }



        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            EnsureChildControls();
        }

        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            _btn = new LinkButton { ID = "btn" };
            Controls.Add(_btn);

        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
        }

        protected override void Render(HtmlTextWriter writer)
        {   
            //<a class="btn {Color} btn-{Color}{CssClass?}{hasImage?}">
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "fancyButton");
            _btn.RenderBeginTag(writer);

            if (Text != null)
            {
                writer.Write(Text);
            }

            _btn.RenderEndTag(writer);

        }
    }
}
namespace Jake
{
    public class FancyButton : LinkButton
    {
        public string Color
        {
            get
            {
                if ( ViewState["Color"] != null && ((string)ViewState["Color"]).Length > 0)
                {
                    return ((string)ViewState["Color"]).ToLower();
                }
                else return "white";
            }
            set { ViewState["Color"] = value; }
        }
        public string Icon
        {
            get { return (string)ViewState["Icon"]; }
            set { ViewState["Icon"] = value; }
        }
        protected override void Render(HtmlTextWriter writer)
        {
            //<a class="btn {Color} btn-{Color}{CssClass?}{hasImage?}">
            writer.AddAttribute(HtmlTextWriterAttribute.Class, string.Format("fancyButton {0}{1}{2}",
                this.Color,
                CssClass.Length > 0 ? " " + CssClass : string.Empty,
                Icon != null && Icon.Length > 0 ? " hasIcon" : String.Empty));
            this.RenderBeginTag(writer);

            // <span>
            writer.RenderBeginTag(HtmlTextWriterTag.Span);

            // <div class="icon {IconClass}"></div>
            if (Icon != null)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Class, string.Format("icon {0}{1}",
                    Icon,
                    Text != null ? " btnIconPadding" : ""));
                writer.RenderBeginTag(HtmlTextWriterTag.Div);
                writer.RenderEndTag();
            }
            if (Text != null)
            {
                writer.Write(Text);
            }

            // </span>
            writer.RenderEndTag();
            this.RenderEndTag(writer);

        }
    }
}