ASP.NET Server.Execute

时间:2009-04-01 19:06:39

标签: c# asp.net

我遇到了一些Server.Execute的问题,我似乎无法找到任何细节。

Page page = new WidgetProcessor(Widget);
Server.Execute(page, htmlTextWriter, true);

上面代码中的Widget是一个知道如何实例化usercontrol的简单对象。 WidgetProcessor采用Widget并将窗口小部件控件添加到页面。这在初始加载时工作正常,但它似乎不处理回发;它永远不会实际触发用户控件事件,它只是一直返回原始页面,就像你从未发布过一样。

我找到了this article from 2003,虽然我认为他们现在已经解决了这个问题。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

我猜测,因为您正在向页面动态添加控件,所以它们不会在正确的时间注册到viewstate中,因此会丢失。使用动态控件时,您必须重新添加具有相同ID的控件,以便它们被拾取并因此可以注册回发。

答案 1 :(得分:0)

您需要在运行Page_Load之前加载控件。 OnInit通常就是它的地方。这意味着在ASP.NET打开ViewState轨道更改之前将注册该控件。打开更改跟踪(在触发Page_Load之前)对该控件的ViewState的所有更改都将被视为脏,因此初始值和更改的值之间不会有任何差异。此外,如果在启用更改跟踪后加载控件,则ViewState引擎将无法判断回发值是否已更改,因为它没有要比较的原始值。

答案 2 :(得分:0)

使用Server.Execute时,会将URL作为参数传递给它,控件将移动到此新页面。代码的执行发生在新页面上。一旦代码执行结束,控件就会在调用它之后返回到初始页面。但是,在Server.Transfer的情况下,它的工作方式非常相似,不同之处在于新页面本身的执行停止(意味着控件不会返回到调用页面)。 在这两种情况下,浏览器中的URL仍然是第一页URL(不刷新到新页面URL),因为不要求浏览器这样做。