【问题标题】:How to force button do a full postback instead of asynchronous postback如何强制按钮执行完整回发而不是异步回发
【发布时间】:2012-09-20 16:13:15
【问题描述】:

在 ASP.NET 4.0 Web 应用程序中,我有一个由 UpdatePanel 包装的用户控件(请参见下面的代码)。

<asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <UC:MyCustomCtrl ID="customCtrl" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

显然,这对于在我的用户控件中导致回发的每个 ASP.NET 控件都非常有效,因为它使回发异步发生。 但是,有一个进程不适用!

我在用户控件中有一个 ASP.NET 按钮(创建报告),它向服务器发出异步请求。然后,服务器创建一个 Excel 电子表格,然后将该电子表格放在 HttpResponse 中以发送回客户端的浏览器,以便他们可以打开/保存它。但是,此时它崩溃了,因为对服务器的请求是异步的,并且显然您不能在异步请求期间将二进制文件放入 HttpResponse 中。

我该如何解决这个问题?

【问题讨论】:

    标签: asp.net user-controls asynchronous-postback


    【解决方案1】:

    在用户控件的Page_Load方法中将此按钮注册为同步回发控件:ScriptManager.GetCurrent(Page).RegisterPostBackControl(CreateReportButton);

    【讨论】:

    • 谢谢。不久前,我得到了类似的答案。但它们本质上是一样的——用 ScriptManager 注册控件。在我的例子中,它涉及在用户控件上找到控件,然后将其注册到 ScriptManager。
    【解决方案2】:

    您可以将触发器添加到允许完整回发的 UpdatePanel。这是一个例子

    <asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <UC:MyCustomCtrl ID="customCtrl" runat="server" />
        </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="btnID" />
        </Triggers>
    </asp:UpdatePanel>
    

    【讨论】:

    • 已经试过了。按钮位于自定义控件内部,尝试使用按钮名称作为触发器甚至无法编译。
    • 那么是否可以将特定的用户控件从更新面板中移除?
    【解决方案3】:

    利用更新面板中的触发器来引用自定义控件和控件内报告按钮上注册的事件,例如

    <Triggers>
         <asp:PostBackTrigger ControlID="customCtrl" EventName="ReportButtonClicked" />
    </Triggers>
    

    【讨论】:

    • 已经试过了。按钮位于自定义控件内部,尝试使用按钮名称作为触发器甚至无法编译。
    • 对,必须在自定义控件中注册一个事件,然后以这种方式引用它,然后进行编辑。
    【解决方案4】:

    与 Eric 的回答类似。我还没有尝试过,但它可能会工作......

    <asp:UpdatePanel ID="UpdatePanel5" runat="server">
        <ContentTemplate>
            <UC:MyCustomCtrl ID="customCtrl" runat="server" />
        </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="customCtrl$btnID" />
        </Triggers>
    </asp:UpdatePanel>
    

    不久前我为验证控件做了类似的事情,所以它在这里也可以工作似乎是合乎逻辑的。

    使用您的 DOM 查看器(我使用 Chrome 的元素检查器)并查看按钮的“名称”是什么(不是 ID)。从包含整个用户控件名称的部分开始,使用其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      相关资源
      最近更新 更多