将scriptmanager导入动态呈现的页面

时间:2010-04-13 15:28:44

标签: asp.net ajax user-controls html-rendering

我们正在动态渲染用户控件:

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。

有什么方法吗?

此致 安德烈亚斯

3 个答案:

答案 0 :(得分:4)

正如其他人所说,如果您的 Page 对象已完成,您可以轻松地动态添加 ScriptManger [Add ScriptManager to Page Programmatically?

您可以尝试使用BuildManager.CreateInstanceFromVirtualPath()来创建 Page 对象吗?您可能是如何创建该对象的问题。创建一个新页面比 newing up Page对象要多一些。

例如

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

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

答案 1 :(得分:1)

你能做这样的事吗:

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

编辑:我认为您还需要将控件添加到页面的表单中,而不仅仅是页面本身,对吧?我的理解是表单是用页面创建的,但如果没有,你应该能够做到:

page.Form = new HtmlForm()

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

page.Controls.Add(page.Form)

答案 2 :(得分: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的setter - 但你是正确的,你可以添加一个新的HtmlForm到Controls集合。添加后,Page.Form属性不再为null。这将允许您动态添加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脚本运行时的Debug版本中找到一些JavaScript错误。