【问题标题】:ASP.Net ITemplate - how do i read the raw content defined insideASP.Net ITemplate - 我如何读取内部定义的原始内容
【发布时间】:2010-04-08 20:04:53
【问题描述】:

我有一种情况,我想阅读 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 里面的内容???

感谢阅读,任何帮助将不胜感激...

【问题讨论】:

    标签: asp.net itemplate


    【解决方案1】:

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

    下面是一个这样做的例子——一个带有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();
        }
    }
    

    【讨论】:

    • 您仍然需要将模板添加到控件集合中。否则它将绕过页面生命周期,并且您将在每次回发时“重置”模板控件。我通常在 CreateChildControls 覆盖中构建我的控件,并将所有模板附加到那里。
    • @Sergei,是的,你是对的。上面的代码只是一个 quick 示例,它的主要目的是展示如何将控件呈现为字符串。无论如何感谢您的评论。
    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多