【问题标题】:How to a string can turn a UserControl如何让一个字符串可以变成一个UserControl
【发布时间】:2009-10-08 02:51:10
【问题描述】:

有什么方法/可能性可以用 UserControl 替换字符串?

除了 LoadControl 并将其添加到另一个控件,如页面或占位符。

原因是用户在页面上添加了一个内容并放置了一个类似 {uc:test} 的字符串,我想解析这个文本并将 {uc:test} 替换为 UserControl。

换句话说; 用户输入将是“bla bla bla {uc:test} bla bla”,当我从数据库中检索它时,如何注入 usercontrol 并将其替换为 {uc:test}

谢谢。

【问题讨论】:

    标签: c# asp.net rendering user-controls


    【解决方案1】:

    尝试使用 LoadControl 方法动态加载用户控件并在回发期间将它们添加到您的页面。

    Control someControl = LoadControl("~/SomeControl.ascx");
    

    您可以...将其添加到页面的控件集合中:

            this.Page.Controls.Add(someControl);
    

    或者...将其添加到另一个控件的控件集合中

            someExistingPlaceHolder.Controls.Add(someControl);
    

    如何使用正则表达式获取这样的标签

    List<string> fields = new List<string>(); 
    foreach(Match match in Regex.Matches(str, @"\{([^\}]*)\}")) { 
        fields.Add(match.Groups[1].Value); 
    } 
    

    【讨论】:

    • 用户输入将是“bla bla bla {uc:test} bla bla”,当我从数据库中检索它时,如何注入 usercontrol 并将其替换为 {uc:test}
    • 使用字符串操作来检测 { 和 } 开头,所以 string.IndexOf() 来获取保留标签的位置然后你可以添加“bla bla bla”作为文本控件,它将呈现为文本,添加 uc:test 控件,添加“bla bla”作为文字控件
    • 得到字符串后可以使用 stringName.Replace("{uc:test}", "userControlHere");
    【解决方案2】:

    如果您希望所有用户输入得到尊重,包括他们包含的任何控件引用,请使用ParseControl

    string markup = input.Replace("{","<").Replace("}",">");
    Control control = this.Page.ParseControl(markup);
    
    this.Page.Controls.Add(control);
    

    这将创建一个新的Control,它将所有文本(“blah blah”)表示为文字子控件,并创建&lt;uc:test&gt; 的新实例作为嵌套子控件。

    【讨论】:

    • ParseControl(@"bla bla bla bla bla");...你如何注册控制uc :test 使其不是未知的服务器标签?我在示例中尝试了 但没有运气。
    • 当在 web.config 中注册时,控件被找到但不呈现...周围的文本确实
    • @Boon 您是否尝试过将该特定控件显式添加到页面并查看它是否正常工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2012-03-13
    相关资源
    最近更新 更多