AsyncPostBackTrigger只是闪烁/轻弹UpdatePanel但不更新它

时间:2012-02-01 08:32:59

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

我正在尝试UpdatePanel&主页上的AsyncPostBackTrigger通过查找控制方法,但问题是当我点击按钮(UpdateButton)时它只是闪存/轻弹(No Postback)UpdatePanle 但仍然没有更新或刷新gridview(图像) )在updatePanel内部。

我已在主页上放置了脚本管理器&子页面中ContentPlaceHolder中的AJAX Update面板。另外,在另一个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>

2 个答案:

答案 0 :(得分: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);
    }
}

此类是一个控件,用于将click事件从母版页代理到子页面,以刷新UpdatePanel。

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

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

接下来,您需要向您的网站/网络应用程序说明它的内容:EventProxy&#39;是。要做到这一点,您需要通过将其添加到web.config文件中的<controls>标记来指示它是一个控件:

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

在上面的例子中,将namespace属性的值设置为EventProxy类的命名空间,并将assembly属性的值设置为解决方案的名称。

完成后,将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之一。

答案 1 :(得分:0)

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