3

我们像这样动态渲染用户控件:

public string RenderControl(string pathcontrol)
{
    string html;

    var page = new Page();
    var control = page.LoadControl(path);            
    page.Controls.Add(control);

    // do stuff to the control (give it some data to work on)

    using (var writer = new StringWriter())
    {
        HttpContext.Current.Server.Execute(page, writer, false);
        html = writer.ToString();
    }

    return html;
}

这让我们在正常呈现页面时可以像在呈现对 ajax 调用的响应时一样使用相同的用户控件。但是,当添加本身包含 scriptmanagerProxy 的控件时,我们会遇到新的 Page 对象不包含 ScriptManager 或 ScriptManager 需要在其中运行的 HtmlForm 的问题。

有没有办法解决?

你的 安德烈亚斯

4

3 回答 3

4

正如其他人所说,您可以轻松地动态添加 ScriptManger [编程方式将 ScriptManager 添加到页面?如果您的Page对象是完整的。

您可以尝试使用BuildManager.CreateInstanceFromVirtualPath()来创建Page对象吗?您的问题可能是您如何创建该对象。与更新Page 对象相比,创建新页面需要做的更多。

例如。

Page page 
       = BuildManager.CreateInstanceFromVirtualPath("~/Test.aspx", typeof(Page))

另请参阅http://www.west-wind.com/weblog/posts/120530.aspx了解更多背景信息。

于 2010-05-01T18:55:36.060 回答
1

你能做这样的事情:

page.Form.Controls.AddAt(0, New ScriptManager())

编辑:我认为您还需要将控件添加到页面的表单中,而不仅仅是页面本身,对吗?据我了解,表单是使用页面创建的,但如果不是,您应该可以这样做:

page.Form = new HtmlForm()

您可能还需要执行以下操作:

page.Controls.Add(page.Form)
于 2010-04-13T15:53:37.197 回答
0

当然,诀窍是将它添加到页面的 Init 事件处理程序中。您可以使用:

Page.Init += delegate {

  // check for script manager
  if( ScriptManager.GetCurrent(Page) == null ) {

    ScriptManager m = new ScriptManager();
    m.ScriptMode = ScriptMode.Release;
    Page.Form.Controls.AddAt(0, m);

  }

}

如果可以的话,我建议避免向页面动态添加表单。例如,上面的代码片段假定页面上已经存在一个表单。

更新

当然,感谢安德烈亚斯指出这一点。这是一个更新。因此,Page.Form 没有设置器 - 但您是正确的,因为您可以将新的 HtmlForm 添加到 Controls 集合中。添加后,Page.Form 属性不再为空。如上所示,这将允许您动态添加 ScriptManager。这是一个显示此工作的代码示例(ASPX 文件是一个没有服务器端表单的简单页面):

public partial class Pages_Test_DynamicFormSample : Page {

    protected void Page_Init(object sender, EventArgs e) {

        Controls.Add( new HtmlForm() );

        ScriptManager m = new ScriptManager();
        m.ScriptMode = ScriptMode.Release;
        Form.Controls.AddAt(0, m);

    }

    protected void Page_Load(object sender, EventArgs e) {

        // ScriptManager test
        var t1 = new System.Web.UI.WebControls.TextBox();
        var t2 = new System.Web.UI.WebControls.TextBox();
        Form.Controls.Add( t1 );
        Form.Controls.Add( t2 );

        ScriptManager.GetCurrent(Page).SetFocus( t2 );

    }

}

享受 - 顺便说一句,显然不需要将 ScriptManager 的 ScriptMode 设置为 Release。我们这样做只是为了避免在 ASP.NET 脚本运行时的调试版本中发现的一些 JavaScript 错误。

于 2010-05-01T04:06:01.920 回答