我遇到了一些Server.Execute的问题,我似乎无法找到任何细节。
Page page = new WidgetProcessor(Widget);
Server.Execute(page, htmlTextWriter, true);
上面代码中的Widget是一个知道如何实例化usercontrol的简单对象。 WidgetProcessor采用Widget并将窗口小部件控件添加到页面。这在初始加载时工作正常,但它似乎不处理回发;它永远不会实际触发用户控件事件,它只是一直返回原始页面,就像你从未发布过一样。
我找到了this article from 2003,虽然我认为他们现在已经解决了这个问题。
任何帮助都将不胜感激。
答案 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),因为不要求浏览器这样做。