【问题标题】:How to stop page execution from inside a Web Part如何从 Web 部件内部停止页面执行
【发布时间】:2011-03-23 02:45:08
【问题描述】:

(我相信这适用于普通的 ASP.NET Web 部件和 SharePoint 托管的 Web 部件)

Web 部件有一个“导出”按钮,可将输出呈现为 csv 并设置适当的标题,以便在 Excel 中打开。

挂钩按钮单击事件、清除响应、添加适当的标题和内容类型是微不足道的 - example

但是我注意到,如果将此代码添加到 Web 部件并附加了调试器,那么如果页面上有此(或任何其他)Web 部件的多个实例,那么HTTPApplication.CompleteRequest 或 Response.End 都不会停止处理/页面生命周期和所有页面控件的所有事件仍然触发。

在此示例中这是一种浪费,因为其他 Web 部件不需要运行 - 他们所做的任何事情都不会得到响应。

有什么方法可以阻止其他 Web 部件的呈现?

【问题讨论】:

    标签: c# asp.net sharepoint


    【解决方案1】:

    如何创建另一个为您执行实际导出功能的页面,然后让导出链接仅链接到另一个页面?

    这应该可以解决必须手动结束请求的问题,因为您可以准确控制响应中的输出内容。

    【讨论】:

    • 这是可行的,并且几乎可以肯定是大多数情况下的方法 - 但是在这种情况下,我有 Web 部件连接提供一些数据(在渲染阶段之前的方式),我会失去那个上下文。我的解决方法是在 OnPreRender 将所有 Page.Controls[].visible 设置为 false - 至少停止 RenderWebPart 等运行。
    • 您可以在新窗口中打开链接,这样您就不会离开页面。任何必要的数据都可以通过查询字符串传递或存储在会话变量中。
    【解决方案2】:

    简短回答:不。

    由于您正在执行完整的回发,HTTP 响应流必须包含服务器交付的整个 HTML 页面。

    您可以通过某些参数使用 ASP.NET 输出缓存和刷新缓存,从而允许您的页面呈现数据已更改的此类 Web 部件。

    阅读此文档了解有关 ASP.NET 缓存的更多信息:

    【讨论】:

    • 回发将返回csv文件,因此不会刷新页面,因此无需重新创建页面。
    【解决方案3】:
    HttpContext.Current.Response.End();
    

    仅用于与 ASP 兼容。

    ApplicationInstance.CompleteRequest();
    

    应该做你想做的事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 2011-03-31
      • 2011-03-19
      • 2017-07-19
      相关资源
      最近更新 更多