2010-04-08 63 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