2010-04-08 65 views
0

我有我想阅读ITemplate内容的情况。ASP.Net ITemplate - 我如何阅读内部定义的原始内容

,比如我有类似

<WD:PopUpPanel runat="server" ID="MyPoPUp"> 
<InitScript> 
    // javascript 
    document.getElementByID('urName').value = 'enter your name'; 
</InitScript> 
<Content> 
    Name:<asp:TextBox runat="Server" ID="urName"/> 
</Content> 
</WD:PopUpPanel> 

基本InitScript里面的内容是一些JavaScript,我想在ScriptManager.RegisterScript使用。

所以我的问题是我如何定义InitScript?

我试图

public ITemplate InitScript; 

这给了我CompiledTemplateBuilder对象,我怎么看里面InitScript内容???

感谢您的阅读,任何帮助将高度赞赏...

回答

2

首先,你需要你的模板实例化为模板容器控件。

下面是这样做的一个例子 - 用InitScript属性的用户控件;该模板正在控制的OnPreRender方法中实例化。在此之后,可以将这个模板控件只是添加到用户控件的子控件集合或者,当你在你的问题问,呈现为一个字符串(我用我的RenderControl实用方法来呈现控制作为一个字符串):

public class MyControl : UserControl 
{ 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public ITemplate InitScript { get; set; } 

    protected override void OnPreRender(EventArgs e) 
    { 
     if (this.InitScript != null) 
     { 
      Control templateContainer = new Control(); 
      InitScript.InstantiateIn(templateContainer); 
      //Controls.Add(templateContainer); 

      // here is "a raw" content of your template 
      var s = RenderControl(templateContainer); 
     } 
    } 

    private string RenderControl(Control control) 
    { 
     StringBuilder sb = new StringBuilder(); 
     using (StringWriter stringWriter = new StringWriter(sb)) 
     { 
      using (HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter)) 
      { 
       control.RenderControl(textWriter); 
      } 
     } 

     return sb.ToString(); 
    } 
} 
+0

您仍然必须将模板添加到控件集合中。否则,它将绕过页面生命周期,并且每次回发都会有“重置”模板控件。我通常在CreateChildControls覆盖中构建我的控件,并在其中附加所有模板。 – 2011-03-29 13:52:45

+0

@Sergei,是的,你是对的。上面的代码只是一个* quick *示例,其主要目的是显示如何将控件呈现为字符串。无论如何感谢您的评论。 – Alex 2011-03-29 19:21:01