代码之家  ›  专栏  ›  技术社区  ›  AndreasKnudsen

将ScriptManager放入动态呈现的页面

  •  3
  • AndreasKnudsen  · 技术社区  · 14 年前

    我们正在动态呈现用户控件,如下所示:

    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调用响应时相同的用户控件。但是,当添加本身包含ScriptManager Proxy的控件时,我们遇到了一个问题,即新的页面对象既不包含ScriptManager,也不包含ScriptManager需要运行的HtmlForm。

    有办法解决这个问题吗?

    你的 安德烈亚斯

    3 回复  |  直到 13 年前
        1
  •  4
  •   Community datashaman    7 年前

    正如其他人所说,你可以添加 抄写员 足够轻松地动态[ Add ScriptManager to Page Programmatically? 如果你 对象已完成。

    你能试着用一下吗 BuildManager.CreateInstanceFromVirtualPath() 创建 反对?问题可能在于如何创建该对象。创建一个新页面比 新生 页面对象。

    如。

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

    也见 http://www.west-wind.com/weblog/posts/120530.aspx 想了解更多的背景。

        2
  •  1
  •   tloflin    14 年前

    你能这样做吗:

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

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

    page.Form = new HtmlForm()
    

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

    page.Controls.Add(page.Form)
    
        3
  •  0
  •   sean2078    14 年前

    当然,技巧是将其添加到页面的in it事件处理程序中。你可以使用:

    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添加到控件集合中,这是正确的。添加后,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错误。