2011-03-22 52 views
2

(我认为,这既适用于普通的ASP.NET Web部件和SharePoint托管Web部件)如何从一个Web部件内停止页面执行

Web部件有一个“出口”按钮呈现输出为csv并设置相应的标题,以便在Excel中打开它。

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

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

这个例子很浪费,因为其他Web部件不需要运行 - 他们所做的任何事情都不会得到响应。

任何阻止其他Web部件被渲染的方法?

回答

1

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

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

+0

这将工作,几乎肯定是大多数情况下去的方式 - 但在这种情况下,我有Web部件连接提供一些数据(在渲染阶段之前的方式),我会失去该上下文。我的解决方法是在OnPreRender中将所有Page.Controls []。设置为false,至少停止RenderWebPart等的运行。 – Ryan 2011-03-22 19:27:15

+0

您可以在新窗口中打开链接,这样您就不会离开页面。任何必要的数据都可以通过查询字符串传递或存储在会话变量中。 – 2011-03-22 20:01:57

0

简答:没有。

由于您正在进行完整回发,因此HTTP响应流必须包含服务器提供的整个HTML页面。

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

了解更多关于ASP.NET缓存阅读本文件:

+0

Postback将返回csv文件,因此不会刷新页面,因此不需要重新创建页面。 – Ryan 2011-03-22 17:40:56

0
HttpContext.Current.Response.End(); 

只是为了与ASP的兼容性。

ApplicationInstance.CompleteRequest(); 

应该做你想做的。

+0

假设 - 但不 – Ryan 2011-03-22 17:39:52