【问题标题】:AsyncPostBackTrigger Just flashing/flicking the UpdatePanel but not updating itAsyncPostBackTrigger 只是闪烁/轻弹 UpdatePanel 但不更新它
【发布时间】:2012-02-01 08:32:59
【问题描述】:

我正在通过查找控制方法在母版页上尝试 UpdatePanel 和 AsyncPostBackTrigger,但问题是当我单击按钮 (UpdateButton) 它只是闪烁/轻弹(无回发)UpdatePanle 但它仍然没有t 更新或刷新 updatePanel 内的网格视图(图像)。

我已将脚本管理器放置在母版页上,并将 AJAX 更新面板放置在子页面的 ContentPlaceHolder 中。此外,在另一个 ContentPlaceholder 中有一个 asp 按钮(在 UpdatePanel 之外)。

我想用这个 asp 按钮刷新/重新加载 AJAX UpdatePanel。

感谢您的建议。

子页面代码:-

protected void Page_Load(object sender, EventArgs e)
 {
        ScriptManager ScriptManager1 = (ScriptManager)Master.FindControl("ScriptManager1");
        ContentPlaceHolder cph = (ContentPlaceHolder)Master.FindControl("cp_Button");
        Button btnRefresh = (Button)cph.FindControl("btnRefresh");
        ScriptManager1.RegisterAsyncPostBackControl(btnRefresh);
 }
 protected void btnRefresh_Click(object sender, EventArgs e)
 {
        UpdatePanel1.Update();

 }         


<%@ Page Title="" Language="C#" MasterPageFile="~/InnerMaster.master" AutoEventWireup="true" CodeFile="A.aspx.cs" Inherits="A" Async="true" %>

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" Runat="Server">
    <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
        <ContentTemplate>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="id" DataSourceID="SqlDataSource1">
             <Columns>
                 <asp:TemplateField>
                     <ItemTemplate>
                        <asp:Image ID="img12" runat="server" Width="650px" Height="600" ToolTip="A" ImageUrl='<%# Page.ResolveUrl(string.Format("~/Cli/{0}", Eval("image"))) %>' />
                     </ItemTemplate>
                 </asp:TemplateField>
             </Columns>
           </asp:GridView>
         </ContentTemplate>
      </asp:UpdatePanel>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="cp_Button" Runat="Server">   
    <asp:Button ID ="btnRefresh" runat="server" onclick="btnRefresh_Click" Height="34" Width="110" Text="More Images" />
</asp:Content>

您好更新代码:- 现在点击事件刷新整个页面。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;


    namespace EProxy
    {
        public class EventProxy : Control, IPostBackEventHandler
        {
            public EventProxy()
            { }

            public void RaisePostBackEvent(string eventArgument)
            { }

            public event EventHandler<EventArgs> EventProxied;

            protected virtual void OnEventProxy(EventArgs e)
            {
                if (this.EventProxied != null)
                {
                    this.EventProxied(this, e);
                }
            }

            public void ProxyEvent(EventArgs e)
            {
                OnEventProxy(e);
            }
        }
    }

在母版页代码上(btn 点击):-

protected void btnRefresh_Click(object sender, EventArgs e)
    {
        ContentPlaceHolder cph = (ContentPlaceHolder)this.FindControl("MainContent");
        EventProxy eventProxy = (EventProxy)cph.FindControl("ProxyControl") as EventProxy;

        eventProxy.ProxyEvent(e);

    }

网络配置:-

<pages maintainScrollPositionOnPostBack="true"  enableViewStateMac="true">
  <controls>
    <add tagPrefix="it" namespace="EProxy" assembly="App_Code"/>
  </controls>
</pages>

【问题讨论】:

    标签: c# asp.net asp.net-ajax


    【解决方案1】:

    它不起作用的原因是因为不能将母版页控件直接用作子页控件的 AsyncPostBackTrigger。但是,有一种通过代理起作用的解决方法。

    首先,您需要创建以下类(将其放在与该类同名的单独 .cs 文件中):

    public class EventProxy : Control, IPostBackEventHandler
    {
        public EventProxy()
        { }
    
        public void RaisePostBackEvent(string eventArgument)
        { }
    
        public event EventHandler<EventArgs> EventProxied;
    
        protected virtual void OnEventProxy(EventArgs e)
        {
            if (this.EventProxied != null)
            {
                this.EventProxied(this, e);
            }
        }
    
        public void ProxyEvent(EventArgs e)
        {
            OnEventProxy(e);
        }
    }
    

    该类是一个控件,用于将主页面的单击事件代理到子页面,以刷新 UpdatePanel。

    创建控件后,在 UpdatePanel 后添加以下内容:

    <it:EventProxy runat="server" ID="ProxyControl" />
    

    接下来,您需要向您的网站/Web 应用程序指明“it:EventProxy”是什么。为此,您需要通过将其添加到 web.config 文件中的 &lt;controls&gt; 标记来表明它是一个控件:

    <pages maintainScrollPositionOnPostBack="true" theme="Default" enableViewStateMac="true">
            <controls>
                <add tagPrefix="it" namespace="The namespace that you saved the EventProxy class in" assembly="Your Assembly name"/>
            </controls>
    </pages>
    

    在上面的示例中,将命名空间属性的值设置为 EventProxy 类的命名空间,并将程序集属性的值设置为您的解决方案的名称。

    完成后,将 EventProxy 控件的 EventProxied 事件作为 AsyncPostBackTrigger 添加到 UpdatePanel。您的标记应如下所示:

     <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="ProxyControl" EventName="EventProxied" />
            </Triggers>
        </asp:UpdatePanel>
        <it:EventProxy runat="server" ID="ProxyControl" />
    

    然后,在您的母版页按钮(将用于刷新子页面 UpdatePanel)中调用以下点击事件:

    protected void btnRefresh_Click(object sender, EventArgs e)
    {
        EventProxy eventProxy = MasterPageContentPlaceHolder.FindControl("ProxyControl") as EventProxy;
        eventProxy.ProxyEvent(e);
    }
    

    就是这样!

    现在会发生什么,当您单击母版页中的按钮时,它将将该单击事件代理到子页的 EventProxy 控件,这反过来会导致 UpdatePanel 刷新,因为 EventProxy 控件是它的一个AsyncPostBackTriggers。

    【讨论】:

    • 非常感谢,但我不确定如何将课程拖到子页面上。它只是变成了一个超链接。我有创建按钮控件吗?你能解释一下吗?谢谢
    • 嗨@Curious Coder..我已经按照确切的步骤进行操作,但现在它是一整页回发或重新加载。您能否查看更新后的代码?谢谢
    • 尝试将按钮放在更新面板内的母版页中。
    • 嗨,我试过了,但它仍然只是闪烁,什么也没发生。另外我从母版页中删除了页面创建新页面(没有母版页)添加了触发器 在更新面板和按钮(btn)中单击它的:- UP1.Update();但它仍然不起作用没有轻弹什么..
    • 嘿伙计,对不起,我直到现在才看到你的回复。只需确保包含以下内容:
    【解决方案2】:

    将您的按钮放在它自己的 updatePanel 中或您想使用该按钮更新的同一 updatePanel 中。一旦这样做,updatePanel 将在没有代码隐藏的情况下更新,按钮单击将为所有更新面板内的所有控件调用异步回发。

    【讨论】:

    • 你好 @boruchsiper 尝试 ..将 btnrefresh 放入新的更新面板 仍然无法正常工作 显示 smae flick /flash 谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多