2009-02-12 81 views
0

我正在尝试构建一个简单的“用户模板”系统,以便我的用户可以编辑RSS提要项目和系统生成的电子邮件的布局,而不会混淆视图文件等。这是我使用的内容替换字符串的标签功能:用简单模板系统中的内容替换标签

private const string URL_TAG_REGEX = @"{{(?<TagName>\w*)}}"; 
private static string ReplaceTags(string content, 
    Dictionary<string, object> values) { 
     Regex r = new Regex(UT_TAG_REGEX); 
     foreach (string tag in values.Keys) { 
      content = r.Replace(content, 
       m => (m.Groups["TagName"].Value == tag ? 
        values[tag].ToString() : string.Empty)); 
     } 
    return content; 
} 

我的测试模板看起来是这样的:

<a href="{{link}}">{{title}}</a> - {{date}}<br /> 
{{description}} 

,并正在与此渲染:

<%= UserTemplates.Render("overview_rss_item", new { 
     link = item.Link, 
     title = item.Title, 
     date = item.PublishDate, 
     description = item.Description 
    }) %> 

Render方法负责打开文件并将匿名对象转换为字典。它主要工作,除了只有{{link}}标签被匹配。其余的正在被string.Empty取代。

+0

你是什么实际问题? – Morendil 2009-02-12 20:55:42

回答

0

因为要更换所有的比赛,并且如果该值不等于标签,你用的String.Empty替换它。试试这个:

foreach (string tag in values.Keys) { 
     content = r.Replace(content, 
      m => (m.Groups["TagName"].Value == tag ? 
       values[tag].ToString() : m.Value)); 
    } 
+0

哇,真是个愚蠢的错误。出于某种原因,我认为Replace一次只会尝试匹配一个标签。谢谢! – 2009-02-12 21:48:43