用用户控件替换字符串

时间:2009-12-15 15:28:29

标签: c# string user-controls replace

如何用UserControl替换字符串?

如果string = [$ control1 $]

替换为control1.ascx

4 个答案:

答案 0 :(得分:1)

您无法将字符串设置为控件,因为它们是完全不同的类型。

您可以将字符串设置为控件的文本,因为文本的类型为string:

string myString = control.Text;

答案 1 :(得分:1)

您是指用户控件的HTML输出是否已加载到页面中?

试试这个:

using System.Web.UI;

public static string RenderToString(this Control control)
{
    var sb = new StringBuilder();
    using (var sw = new StringWriter(sb))
    using (var textWriter = new HtmlTextWriter(sw))
    {
        control.RenderControl(textWriter);
    }

    return sb.ToString();
}

<强>更新

啊 - 首先你需要字符串的解析器(似乎是How to a string can turn a UserControl的内容) - 这将为你提供要替换的用户控件的名称。

从@ Boon回答这个问题:

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

那么我们需要一个函数来加载控件:

Dictionary<string, string> GetControls( List<string> controlNames )
{
    Dictionary<string, string> retval = new Dictionary<string, string>();
    foreach( string controlName in controlNames ) {
    {
        // load the control
        Control ctrl = LoadControl("~/AllowedDynamicControls/" + controlName + ".ascx");

        // add to the dictionary
        retval.Add(controlName, ctrl.RenderToString() );
    }
}

然后使用此结果替换标记:

var tokensInString = FindTokens(input);
var tokenContent = GetControls( tokensInString );

foreach( var pair in tokenContent ) 
{
    input = input.Replace( "[$" + pair.Key + "$]", pair.Value);
}

这可能是更有效的方法 - 我使用替换作为一个简单的例子。

答案 2 :(得分:0)

您还可以将控件呈现为字符串:

StringWriter sw = new StringWriter();
HtmlTextWriter htmlw = new HtmlTextWriter(sw);
ctr.RenderControl(htmlw);
string stringText = sw.ToString();

答案 3 :(得分:0)

说模板字符串是: {product_thumbnail} | {product_title} | {} PRODUCT_PRICE 并且您希望用控件替换方括号({})中的每个文本。我就是这样做的。

string templateString = "{product_thumbnail}  | {product_title}  | {product_price} ";
Regex d = new Regex("\\{\\w+\\}", RegexOptions.Multiline);
MatchEvaluator matchEval = RegexReplaceEvaluator;
string r = d.Replace(templateString, matchEval);

private string RegexReplaceEvaluator(Match match)
{
  string matchValue = match.Value.Trim('}');
  matchValue = matchValue.Trim('{');
  Control toAdd = null;
  switch (matchValue)
  {
     case "product_thumbnail":
          toAdd = this.LoadControl("ThumbnailImage.ascx", DetailsRow);
     break;
     case "product_price":
          toAdd= this.LoadControl("Price.ascx", DetailsRow);
   .....
  }   //end switch statement

if (toAdd != null) {
                PlaceHolder1.Controls.Add(new LiteralControl(templateString.Substring(stringIndexMarker, match.Index - stringIndexMarker)));
                stringIndexMarker = match.Index + match.Length;
                PlaceHolder1.Controls.Add(toAdd);
            }
            return match.Value;
}//end method

上面的代码只执行以下操作:    1.获取模板字符串。 (带有文本的字符串替换为控件)。    2.声明占位符(保存最终输出)。    3.通过字符串迭代。当它找到要用控件替换的字符串时,它会在此之前获取文本,将其作为文本添加到占位符并添加控件。

希望这是有道理的。